如何在Java中的long的特定位置设置/取消设置位?
例如,
long l = 0b001100L ; // bit representation
我想在位置2处设置位并在位置3处取消设置位,因此相应的长度将为
long l = 0b001010L ; // bit representation
有人可以帮我怎么做吗?
答案 0 :(得分:64)
要设置位,请使用:
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
答案 1 :(得分:7)
最低有效位(lsb)通常称为位0,因此您的位置2&#39;真的是#1;#1;&#39;。
long x = 0b001100; // x now = 0b001100
x |= (1<<1); // x now = 0b001110 (bit 1 set)
x &= ~(1<<2); // x now = 0b001010 (bit 2 cleared)
答案 2 :(得分: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
答案 3 :(得分:-1)
有关将long转换为bitset的方法,请参阅此文章BitSet to and from integer/long
答案 4 :(得分:-1)
请参阅为您完成工作的java.util.BitSet类。
设置:myByte.set(bit);
要重置:myByte.clear(bit);
填写一个布尔:myByte.set(bit, b);
获得布尔:b = myByte.get(bit);