您将使用哪种方法来确定代表2^x的位是1或0?

有帮助吗?

解决方案

我会使用:

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

(您也许可以从较少的括号中摆脱困境,但我永远不会记得位于位操作的优先级。)

其他提示

另一个选择:

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

我怀疑是否:

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

  }

..更好,因为价值是否长,还是更糟,因为它不太明显。

汤姆·霍顿(Tom Hawtin) - 7月7日在14:16

您也可以使用

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

编辑:之间的区别(value>>x) & 1“ 和 ”value & (1<<x)“当X大于“值”类型的大小(在您的情况下为32)时,“依赖于行为。

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

如果您希望在这种情况下有0,则可以使用“>>>“操作员,相反”>>"

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

为了 nTH LSB(最不重要的一点),以下内容应起作用:

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

有点变化 直接通过X检查最低位。

在Java中,以下工作正常:

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

valuexint 或者 long (并且不需要相同)。

非Java程序员的谨慎: :前面的表达在Java中起作用,因为在该语言中,位移动运算符仅适用于5(或6) long)右侧操作数的最低位。这隐含地将表达转化为 value << (~x & 31) (或者 value << (~x & 63) 如果 valuelong).

JavaScript: :它还在JavaScript中起作用(例如Java,仅应用最低的5位移位计数)。在JavaScript中 number 是32位。

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

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

声明温度int并使其等于原始。然后移动温度>> x次,以便您要检查的位在最后一个位置。然后做临时&0xf以删除前面的位。现在留下最后一点点。最后,如果(y&1 == 0),如果最后一个位是1,则应等于0,否则将等于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

我的贡献 - 忽略先前的

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 操作数。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top