您将使用哪种方法确定代表2 ^ x的位是1还是0?
您将使用哪种方法确定代表2 ^ x的位是1还是0?
Answers:
我会用:
if ((value & (1L << x)) != 0)
{
// The bit was set
}
(您也许可以用更少的括号摆脱掉,但我不记得按位运算的优先级。)
==
为=
-导致分配该值的有效表达式,这不是我想要的。在Java中,这是非法的(假设它不是boolean
变量)。按位运算符是Java的一部分,这对IMO来说是一件好事。在很多情况下,您需要按位运算符。有没有需要混为一谈,与是否没有条件表达式的类型while
,if
等等应该是boolean
-我认为它应该。
另一种选择:
if (BigInteger.valueOf(value).testBit(x)) {
// ...
}
您也可以使用
bool isSet = ((value>>x) & 1) != 0;
编辑:“ (value>>x) & 1
”和“ value & (1<<x)
”之间的区别取决于x大于“值”(在您的情况下为32)类型的大小时的行为。
在这种特殊情况下,使用“ (value>>x) & 1
”会得到值的符号,而使用“ value & (1<<x)
”会得到0 (如果x太大,获得位符号有时会很有用)。
如果您希望在这种情况下使用0,则可以使用“ >>>
”运算符,如果使用“ >>
”
因此,“ ((value>>>x) & 1) != 0
”和“ (value & (1<<x)) != 0
”是完全等效的
在Java中,以下工作正常:
if (value << ~x < 0) {
// xth bit set
} else {
// xth bit not set
}
value
并且x
可以是int
或long
(并且不必相同)。
对于非Java程序员,请注意:前面的表达式在Java中有效,因为在该语言中,移位运算符仅适用long
于右侧操作数的最低5位(如果为,则为6 )。此隐含地平移表达式value << (~x & 31)
(或者value << (~x & 63)
如果value
IS long
)。
Javascript:它也可以在javascript中使用(就像Java,仅应用移位计数的最低5位)。在javascript中,任何number
为32位。
尤其是在C语言中,负移位计数会调用未定义的行为,因此此测试不一定有效(尽管它可能取决于您的编译器/处理器的特定组合)。
如果某人对按位运算符不太满意,则可以尝试使用以下代码以编程方式确定它。有两种方法。
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
声明一个temp int并使它等于原始值。然后将temp >> x移位,以便要检查的位在最后一个位置。然后执行temp&0xf删除前面的位。现在剩下最后一点。最后,如果(y&1 == 0),如果最后一位是1,则应等于0,否则应等于1。如果不是(y + 0x1 == 0)...不太确定。鬼混看看
我的贡献-忽略上一个
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 ");
}
}
}
我编码了一个静态类,它正在执行一些位操作。
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;
}
}
如果有任何疑问,请给我写一封电子邮件。
好的编程!