Java:检查长度是否为0或1

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

我会使用:

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

(你可以用更less的括号逃脱,但我从来不记得按位运算的优先级。)

另一种select:

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

我怀疑是否:

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

..是更好的,因为价值是否长期并不重要,或者如果它更糟,因为它不明显。

汤姆·霍金 – 7月7日14:16

你也可以使用

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

编辑:“ (value>>x) & 1 ”和“ value & (1<<x) ”之间的差异依赖于当x大于“值”types的大小(在你的情况下是32) 。

在这个特殊的情况下,用“ (value>>x) & 1 ”来表示有价值的符号,而用“ value & (1<<x) ”得到0(有时候得到位符号如果x太大)。

如果你喜欢在这种情况下有0,你可以使用“ >>> ”运算符,而不是“ >>

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

你可能想看看BitSet: http : //java.sun.com/javase/6/docs/api/java/util/BitSet.html

对于第n个LSB(最低有效位),以下应该工作:

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

向右移位 x并检查最低位。

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

在Java中,以下工作正常:

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

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

非Java程序员的注意事项 :前面的expression式适用于Java,因为在该语言中,位移运算符仅适用于右侧操作数的5位(或6位,如果是long )最低位。 这隐式地将expression式转换为value << (~x & 31) (或者如果valuelongvalue value << (~x & 63) )。

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

声明一个临时int并使其等于原始值。 然后转换温度>> x次,所以你想检查的位是在最后的位置。 然后执行temp&0xf来删除前面的位。 现在留下最后一位。 最后如果(y&1 == 0),如果最后一位是1,应该等于0,否则将等于1.它或者如果(y + 0x1 == 0)…不太确定。 愚弄周围,看看

如果有人对位操作符不太熟悉,那么可以尝试下面的代码以编程方式决定它。 有两种方法。

1)使用java语言function来获取二进制格式string,然后在特定位置检查字符

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 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; } } 

如果有一些问题,请给我发电子邮件。

好编程!

消除偏移和错综复杂的问题,并为右侧and操作数使用LUT 。