您会使用哪种方法来确定代表2^x的位是1还是0?
我会使用:
if ((value & (1L << x)) != 0)
{
// The bit was set
}
(你也许可以少用一些括号,但我从来不记得按位运算的优先级。)
另一个选择:
if (BigInteger.valueOf(value).testBit(x)) {
// ...
}
我在想:
if (((value >>> x) & 1) != 0) {
}
.. 更好是因为它不在乎值是长的还是短的,或者即使更糟糕也因为它不那么明显。
Tom Hawtin - tackline Jul 7 at 14:16
bool isSet = ((value>>x) & 1) != 0;
编辑:"(value>>x) & 1
" 和 "value & (1<<x)
" 的不同之处在于当 x 大于 "value" 类型的大小时 (在您的情况下为 32),它们的行为是不同的。
在那种情况下,使用 "(value>>x) & 1
" 会得到 value 的符号,而使用 "value & (1<<x)
" 则会得到0(如果 x 太大,有时获取比特符号很有用)。
如果您希望在这种情况下得到 0,则可以使用 ">>>
" 运算符,而不是 ">>
"。
因此,"((value>>>x) & 1) != 0
" 和 "(value & (1<<x)) != 0
" 是完全等价的。
对于第n
位最低有效位(LSB),以下方法应该适用:
boolean isSet = (value & (1 << n)) != 0;
您可能想要查看BitSet:http://java.sun.com/javase/6/docs/api/java/util/BitSet.html
(BitSet是Java中的一个类,用于表示一组二进制位的值。您可以访问上述链接了解更多信息。)if (value << ~x < 0) {
// xth bit set
} else {
// xth bit not set
}
value
和x
可以是int
或long
(不需要相同)。
非Java程序员请注意:前面的表达式在Java中有效,因为在该语言中,位移操作符仅适用于右手边操作数的5个(或6个,在long
的情况下)最低位。这会将表达式隐式转换为value << (~x & 31)
(如果value
是long
,则为value << (~x & 63)
)。
Javascript:它也可以在javascript中工作(与java一样,只应用移位计数的最低5位)。在javascript中,任何number
都是32位的。
特别是在C语言中,负移位计数会引发未定义的行为,因此此测试不一定有效(尽管根据您的编译器/处理器的特定组合可能有效)。
因此,整个思路是将第x位恰好移入符号位。这意味着向左移动31-x
(如果value
宽度为64位,则为63-x
)。
在Java(以及其他语言中),〜
运算符计算按位 NOT
操作,在算术上等于-x-1
(无论x
有多宽)。
此外,java的<<
运算符仅使用右侧操作数的最低5(或6)位(5或6取决于左侧操作数的宽度:对于int
,则为5;对于long
,则为6)。在算术上,这与除以32(或64)的余数相同。
这里是关于编程的内容:(-x - 1) % 32
= 31 - x
(对于64位的value
,则为(-x - 1) % 64
= 63 - x
)。
2的x次方位的值为“变量 & (1 << x)”。
我的贡献 - 忽略之前的
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 ");
}
}
}
==
打成=
,这会导致赋值一个值的有效表达式,而这不是我想要的。在Java中,这是非法的(假设它不是一个boolean
变量)。按位运算符是Java的一部分,我认为这是件好事。有很多情况下你需要用到按位运算符。没有必要将这与while
、if
等条件表达式的类型是否应该为boolean
进行混淆 - 我认为应该为boolean
。 - Jon Skeet