Java: 检查 a bit 在 long 中是0还是1

你会用什么方法来确定表示2 ^ x 的位是1还是0?

86101 次浏览

我会用:

if ((value & (1L << x)) != 0)
{
// The bit was set
}

(您可以使用更少的括号,但是我从来不记得按位操作的优先级。)

对于 nth LSB (最小有效位) ,以下代码应该可以工作:

boolean isSet = (value & (1 << n)) != 0;

2 ^ x 位的值是“ variable & (1 < < x)”

按 x 进行位移 并检查最低位。

你也可以用

bool isSet = ((value>>x) & 1) != 0;

编辑: “ (value>>x) & 1”和“ value & (1<<x)”之间的区别取决于当 x 大于“ value”类型的大小时的行为(在您的例子中是32)。

在这种特殊情况下,使用“ (value>>x) & 1”将得到值的符号,而使用“ value & (1<<x)”将得到0(如果 x 太大,有时得到位符号是有用的)。

在这种情况下,如果希望使用0,可以使用“ >>>”运算符,而不是“ >>”运算符

所以“ ((value>>>x) & 1) != 0”和“ (value & (1<<x)) != 0”是完全等价的

另一种选择:

if (BigInteger.valueOf(value).testBit(x)) {
// ...
}

我想知道:

  if (((value >>> x) & 1) != 0) {


}

..是更好的,因为价值是长是短并不重要,或者价值是否更差也不重要,因为价值不那么明显。

汤姆霍廷-抢断7月7日在14:16

消除位移及其复杂性,并使用正确的 and操作数的 LUT

我的贡献-忽略前一个

public class TestBits {


public static void main(String[] args) {


byte bit1 = 0b00000001;
byte bit2 = 0b00000010;
byte bit3 = 0b00000100;
byte bit4 = 0b00001000;
byte bit5 = 0b00010000;
byte bit6 = 0b00100000;
byte bit7 = 0b01000000;


byte myValue = 9;                        // any value


if (((myValue >>> 3) & bit1 ) != 0) {    //  shift 3 to test bit4
System.out.println(" ON ");
}
}
}

声明一个 temp int 并使其等于原始的。 然后移动温度 > x 次,这样你要检查的位就在最后一个位置。然后执行 temp & 0xf 删除前面的位。现在离开最后一点。最后做如果(y & 1 = = 0) ,如果最后一位是1,那应该等于0,else 将等于1。要么是这样,要么是(y + 0 x1 = = 0) ... ... 不太确定。四处闲逛看看

如果有人对按位运算符不是很熟悉,那么可以尝试用下面的代码以编程方式确定它。有两种方法。

1)使用 Java 语言功能获取二进制格式字符串,然后检查特定位置的字符

2)保持除以2,并在一定位置确定位值。

public static void main(String[] args) {
Integer n =1000;
String binaryFormat =  Integer.toString(n, 2);
int binaryFormatLength = binaryFormat.length();
System.out.println("binaryFormat="+binaryFormat);
for(int i = 1;i<10;i++){
System.out.println("isBitSet("+n+","+i+")"+isBitSet(n,i));
System.out.println((binaryFormatLength>=i && binaryFormat.charAt(binaryFormatLength-i)=='1'));
}


}


public static boolean isBitSet(int number, int position){
int currPos =1;
int temp = number;
while(number!=0 && currPos<= position){
if(temp%2 == 1 && currPos == position)
return true;
else{
temp = temp/2;
currPos ++;
}
}
return false;
}

输出

binaryFormat=1111101000
isBitSet(1000,1)false
false
isBitSet(1000,2)false
false
isBitSet(1000,3)false
false
isBitSet(1000,4)true
true
isBitSet(1000,5)false
false
isBitSet(1000,6)true
true
isBitSet(1000,7)true
true
isBitSet(1000,8)true
true
isBitSet(1000,9)true
true

我编写了一个静态类,用来做一些位操作。

public final class Bitfield {


private Bitfield() {}


// ********************************************************************
// * TEST
// ********************************************************************


public static boolean testBit(final int pos, final int bitfield) {
return (bitfield & (1 << pos)) == (1 << pos);
}


public static boolean testNum(final int num, final int bitfield) {
return (bitfield & num) == num;
}


// ********************************************************************
// * SET
// ********************************************************************


public static int setBit(final int pos, final int bitfield) {
return bitfield | (1 << pos);
}


public static int addNum(final int number, final int bitfield) {
return bitfield | number;
}


// ********************************************************************
// * CLEAR
// ********************************************************************


public static int clearBit(final int pos, final int bitfield) {
return bitfield ^ (1 << pos);
}


public static int clearNum(final int num, final int bitfield) {
return bitfield ^ num;
}


}

如果有什么问题,给我写封电子邮件。

好编程!

在 Java 中,以下工作很好:

if (value << ~x < 0) {
// xth bit set
} else {
// xth bit not set
}

valuex可以是 intlong(不需要相同)。

给非 Java 程序员的忠告 : 前面的表达式在 Java 中工作,因为在 Java 语言中,位移运算符只适用于右边操作数的5(或6,如果是 long)最低位。这隐式地将表达转换为 value << (~x & 31)(如果 valuelong,则为 value << (~x & 63))。

Javascript : 它也可以在 Javascript 中工作(和 java 一样,只应用最低的5位移位计数)。在 javascript 中,任何 number都是32位的。

特别是在 c 中,负移位计数调用未定义行为,所以这个测试不一定有效(尽管它可能有效,这取决于你特定的编译器/处理器组合)。

它是怎么工作的?

这个答案的聪明之处在于,整数的符号位非常容易读取: 当设置该位时,该值为负; 如果不设置,则该值为零或正。

所以整个想法就是把 xth 位精确地转换成符号位。这意味着 31 - x向左移位(或者 63 - x,如果 value是64位宽)。

在 java (以及其他语言)中,~操作符计算 按位 NOT运算,算术上等于 -x - 1(无论 x有多宽)。

同样,java <<操作符只接受右边操作数的最小有效5(或6)位(5或6取决于左边操作数的宽度: 对于 int,5; 对于 long,6)。从算术上讲,这与除以32(或64)的余数相同。

那就是 (-x - 1) % 32 = 31 - x(或者 (-x - 1) % 64 = 63 - x,对于64位宽的 value)。