【问题标题】:How to set/unset a bit at specific position of a long?如何在长的特定位置设置/取消设置?
【发布时间】:2012-08-18 03:29:14
【问题描述】:

如何在 Java 中 long 的特定位置设置/取消设置?

例如,

long l = 0b001100L ; // bit representation

我想在位置 2 设置位并在位置 3 取消设置位,因此对应的 long 将是,

long l = 0b001010L ; // bit representation

谁能帮我怎么做?

【问题讨论】:

  • 我认为使用 BitSet 不是一种选择。

标签: java bit-manipulation bitwise-operators


【解决方案1】:

要设置一点,请使用:

x |= 0b1; // set LSB bit
x |= 0b10; // set 2nd bit from LSB

擦除一点使用:

x &= ~0b1; // unset LSB bit (if set)
x &= ~0b10; // unset 2nd bit from LSB

切换位使用:

x ^= 0b1;

注意我用的是 0b?。你也可以使用任何整数,例如:

x |= 4; // sets 3rd bit
x |= 0x4; // sets 3rd bit
x |= 0x10; // sets 9th bit

但是,很难知道哪个位正在被更改。

使用二进制可以让您查看将设置/擦除/切换的确切位。

要动态设置位,请使用:

x |= (1 << y); // set the yth bit from the LSB

(1 &lt;&lt; y) 将 ...001 向左移动 y 位,因此您可以将设置的位移动 y 位。

您也可以一次设置多个位:

x |= (1 << y) | (1 << z); // set the yth and zth bit from the LSB

或取消设置:

x &= ~((1 << y) | (1 << z)); // unset yth and zth bit

或切换:

x ^= (1 << y) | (1 << z); // toggle yth and zth bit

【讨论】:

  • 对不起,我应该提一下,我希望它是动态的,意味着将位置作为参数传递,而不是固定值。
  • 值得一提的是如何检查位:右移它和bit = (x &gt;&gt; y) &amp; 1
【解决方案2】:

最低有效位 (lsb) 通常称为位 0,因此您的“位置 2”实际上是“位 1”。

long x = 0b001100;  // x now = 0b001100
x |= (1<<1);        // x now = 0b001110 (bit 1 set)
x &= ~(1<<2);       // x now = 0b001010 (bit 2 cleared)

【讨论】:

    【解决方案3】:

    我会为此选择BigInteger...

    class Test {
        public static void main(String[] args) throws Exception {
            Long value = 12L;
            BigInteger b = new BigInteger(String.valueOf(value));
            System.out.println(b.toString(2) + " " + value);
            b = b.setBit(1);
            b = b.clearBit(2);
            value = Long.valueOf(b.toString());
            System.out.println(b.toString(2) + " " + value);
        }
    }
    

    这是输出:

    1100 12
    1010 10
    

    【讨论】:

    • 不要使用 BigInteger。它不是为操作位而设计的(慢?!?)。如果您想要一个任意长度的位容器,请使用位集。
    【解决方案4】:
    • 将 long 转换为 bitset
    • 设置你需要的位
    • 将 bitset 转换回 long

    请参阅此帖子 BitSet to and from integer/long 了解将 long 转换为 bitset 的方法,反之亦然

    【讨论】:

    • 使用位集可以工作,但我不建议仅仅为了位操作而来回转换。决定是要使用 long 还是 bitset,并坚持下去。
    【解决方案5】:

    请查看为您完成这项工作的 java.util.BitSet 类。

    设置:myByte.set(bit); 重置:myByte.clear(bit); 用 bool 填充:myByte.set(bit, b); 获取布尔值:b = myByte.get(bit);

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 2015-07-21
      • 2021-04-25
      • 2016-07-22
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多