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

Arp*_*sss 25 java bit-manipulation bitwise-operators

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

例如,

long l = 0b001100L ; // bit representation
Run Code Online (Sandbox Code Playgroud)

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

long l = 0b001010L ; // bit representation
Run Code Online (Sandbox Code Playgroud)

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

ron*_*chn 67

要设置一点,请使用:

x |= 0b1; // set LSB bit
x |= 0b10; // set 2nd bit from LSB
Run Code Online (Sandbox Code Playgroud)

擦除一点用法:

x &= ~0b1; // unset LSB bit (if set)
x &= ~0b10; // unset 2nd bit from LSB
Run Code Online (Sandbox Code Playgroud)

切换一点用法:

x ^= 0b1;
Run Code Online (Sandbox Code Playgroud)

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

x |= 4; // sets 3rd bit
x |= 0x4; // sets 3rd bit
x |= 0x10; // sets 9th bit
Run Code Online (Sandbox Code Playgroud)

但是,它更难以知道哪个位正在被更改.

使用二进制允许您查看将设置/擦除/切换的确切位.

要动态设置位,请使用:

x |= (1 << y); // set the yth bit from the LSB
Run Code Online (Sandbox Code Playgroud)

(1 << y) 向左移动... 001 y,所以你可以移动设置位y位置.

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

x |= (1 << y) | (1 << z); // set the yth and zth bit from the LSB
Run Code Online (Sandbox Code Playgroud)

或者取消设置:

x &= ~((1 << y) | (1 << z)); // unset yth and zth bit
Run Code Online (Sandbox Code Playgroud)

或者切换:

x ^= (1 << y) | (1 << z); // toggle yth and zth bit
Run Code Online (Sandbox Code Playgroud)


pus*_*ect 7

最低有效位(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)
Run Code Online (Sandbox Code Playgroud)