Java:检查长度为0或1

时间:2009-07-07 13:41:44

标签: java long-integer bit-shift

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

14 个答案:

答案 0 :(得分:165)

我会用:

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

(你可以用更少的括号来逃避,但我永远不会记住按位运算的优先级。)

答案 1 :(得分:89)

另一种选择:

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

答案 2 :(得分:14)

我想知道:

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

  }

..更好,因为价值是否很长无关紧要,或者更糟糕因为它不太明显。

Tom Hawtin - 7月7日星期四14:16

答案 3 :(得分:12)

您也可以使用

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

编辑:“(value>>x) & 1”与“value & (1<<x)”之间的差异依赖于x大于“值”类型(在您的情况下为32)的大小时的行为。

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

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

因此,“((value>>>x) & 1) != 0”和“(value & (1<<x)) != 0”完全等效

答案 4 :(得分:8)

对于n LSB(最低有效位),以下内容应该有效:

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

答案 5 :(得分:6)

答案 6 :(得分:4)

x右边的{p> Bit shifting并检查最低位。

答案 7 :(得分:4)

在Java中,以下工作正常:

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

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

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

Javascript :它也适用于javascript(如java,只应用最低5位的移位计数)。在javascript中,任何number都是32位。

特别是在C中,负移位计数会调用未定义的行为,因此该测试不一定有效(尽管可能会有所不同,具体取决于您的编译器/处理器的特定组合)。

答案 8 :(得分:2)

2 ^ x位的值是“变量&amp;(1&lt;&lt; x)”

答案 9 :(得分:1)

声明一个临时int并使其等于原始。 然后转移温度&gt;&gt; x次,以便您要检查的位位于最后位置。那么做温度&amp; 0xf删除前面的位。现在留下最后一点。最后如果(y&amp; 1 == 0),如果最后一位是1,则应该等于0,否则将等于1.它要么是或者如果(y + 0x1 == 0)......不太确定。傻瓜,看看

答案 10 :(得分:1)

如果有人对按位运算符不太满意,那么可以尝试以下代码以编程方式决定它。有两种方式。

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

答案 11 :(得分: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 "); 
        }
    } 
}

答案 12 :(得分:0)

我编写了一个静态类,它正在执行一些位操作。

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

  }

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

良好的编程!

答案 13 :(得分:-2)

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