Jon*_*eet 167
我用的是:
if ((value & (1L << x)) != 0)
{
// The bit was set
}
Run Code Online (Sandbox Code Playgroud)
(您可以使用更少的括号来逃避,但我永远不会记住按位运算的优先级.)
fin*_*nnw 90
另一种选择:
if (BigInteger.valueOf(value).testBit(x)) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
And*_*NER 14
我怀疑是否:
if (((value >>> x) & 1) != 0) {
}
Run Code Online (Sandbox Code Playgroud)
..更好,因为价值是否很长无关紧要,或者更糟,因为它不太明显.
Tom Hawtin - 7月7日14:16发表讲话
Thi*_*hib 12
你也可以使用
bool isSet = ((value>>x) & 1) != 0;
Run Code Online (Sandbox Code Playgroud)
编辑:当"x"大于"值"类型(在您的情况下为32)的大小时," (value>>x) & 1"和" value & (1<<x)" 之间的差异依赖于行为.
在这种特殊情况下,使用" (value>>x) & 1",您将获得值的符号,而使用" value & (1<<x)" 获得0 (如果x太大,有时可以获得位符号).
如果您希望在这种情况下使用0,则可以使用" >>>"运算符,而不是" >>"
所以," ((value>>>x) & 1) != 0"和" (value & (1<<x)) != 0"完全等同
对于n第LSB(最低有效位),以下应该起作用:
boolean isSet = (value & (1 << n)) != 0;
Run Code Online (Sandbox Code Playgroud)
在 Java 中,以下工作正常:
if (value << ~x < 0) {
// xth bit set
} else {
// xth bit not set
}
Run Code Online (Sandbox Code Playgroud)
value并且x可以是int或long(并且不需要相同)。
对非 Java 程序员的警告long:前面的表达式在 Java 中有效,因为在该语言中,位移运算符仅适用于右侧操作数的5 个(或 6 个,如果是)最低位。这隐式地将表达式转换为value << (~x & 31)(或value << (~x & 63)if valueis long)。
Javascript:它也适用于 javascript(与 java 一样,仅应用移位计数的最低 5 位)。在 javascript 中,anynumber是 32 位的。
特别是在 C 中,负移位计数会调用未定义的行为,因此此测试不一定有效(尽管可能有效,具体取决于编译器/处理器的特定组合)。
这个答案的巧妙之处在于,整数的符号位非常容易阅读:当该位被设置时,该值是负数;当该位被设置时,该值是负数。如果未设置,则该值为零或正数。
所以整个想法是将第 x 位精确地移入符号位。31 - x这意味着向左位移(或者63 - x,如果value是 64 位宽)。
在java(以及其他语言)中,~运算符计算按位NOT运算,它在算术上等于-x - 1(无论多宽x)。
此外,java<<运算符仅采用右侧操作数的最低有效 5(或 6)位(5 或 6 取决于左侧操作数的宽度:对于intthen 5;对于longthen 6)。从算术上讲,这与除以 32(或 64)的余数相同。
这就是(-x - 1) % 32= 31 - x(或(-x - 1) % 64= 63 - x,对于 64 位宽value)。