79

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

4

14 回答 14

186

我会使用:

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

(你也许可以少用括号,但我从不记得按位运算的优先级。)

于 2009-07-07T13:42:54.307 回答
101

另一种选择:

if (BigInteger.valueOf(value).testBit(x)) {
    // ...
}
于 2009-07-07T14:05:00.923 回答
15

我怀疑是否:

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

  }

.. 更好,因为价值是否长并不重要,或者更糟糕,因为它不太明显。

Tom Hawtin - 7 月 7 日 14:16 的抢断线

于 2009-07-15T10:26:53.313 回答
13

你也可以使用

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”是完全等价的

于 2009-07-07T13:46:24.147 回答
8

对于第nth LSB(最低有效位),以下应该有效:

boolean isSet = (value & (1 << n)) != 0;
于 2009-07-07T13:43:46.427 回答
7

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

于 2009-08-29T11:56:19.067 回答
4

右移x 并检查最低位。

于 2009-07-07T13:44:05.333 回答
4

在Java中,以下工作正常:

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

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

对非 Java 程序员的警告:前面的表达式在 Java 中有效,因为在该语言中,移位运算符仅适用于long右侧操作数的 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)。

于 2016-01-12T02:45:40.890 回答
2

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

于 2009-07-07T13:43:56.880 回答
1

我的贡献 - 忽略上一个

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 "); 
        }
    } 
}
于 2012-09-28T23:27:51.480 回答
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
于 2014-06-14T10:12:55.183 回答
0

声明一个 temp int 并使其等于原始值。然后将 temp >> x 移位,以便您要检查的位位于最后一个位置。然后执行 temp & 0xf 删除前面的位。现在留下最后一点。最后做 if (y & 1 == 0),如果最后一位是 1,那应该等于 0,否则将等于 1。要么是那个,要么是 if (y+0x1 == 0)...不太确定。鬼混看看

于 2012-12-17T18:45:53.090 回答
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;
  }

  }

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

好编程!

于 2015-10-14T16:23:37.240 回答
-2

消除位移及其复杂性,并为正确的操作数使用LUTand

于 2009-08-30T15:00:28.420 回答