29

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

例如,

long l = 0b001100L ; // bit representation

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

long l = 0b001010L ; // bit representation

有人可以帮我怎么做吗?

4

5 回答 5

74

要设置一点,请使用:

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 << 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
于 2012-08-18T03:35:10.213 回答
8

最低有效位 (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)
于 2012-08-18T03:45:21.963 回答
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
于 2012-08-18T04:09:36.163 回答
-1
  • 将 long 转换为 bitset
  • 设置您需要的位
  • 将 bitset 转换回 long

有关将 long 转换为 bitset 的方法,请参阅这篇文章BitSet 与 integer/long之间的转换,反之亦然

于 2012-08-18T03:52:29.410 回答
-1

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

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

于 2015-05-22T08:50:41.453 回答