如何在长的特定位置设置/取消位?

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

例如,

long l = 0b001100L ; // bit representation 

我想在位置2处设置位并在位置3处取消设置位,因此相应的长度将是,

 long l = 0b001010L ; // bit representation 

任何人都可以帮我怎么做?

要设置一点,请使用:

 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 

最低有效位(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) 

我会为此选择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 
  • 将long转换为bitset
  • 设置你需要的位
  • 将bitset转换回long

有关将long转换为bitset的方法,请参阅此文章BitSet to和from integer / long ,反之亦然

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

设置: myByte.set(bit); 要重置: myByte.clear(bit); 填写bool: myByte.set(bit, b); 得到bool: b = myByte.get(bit);