Java 提供了用于操作整数类型(byte、short、int、long或char)各个位的运算符。
使用<<可以将位向左移,使用>>可以将位向右移。
// Shift two places to the left
0b0000_1011 << 2;
// # => 0b0010_1100
// Shift two places to the right
0b0000_1011 >> 2;
// # => 0b0000_0010
>>也称为有符号移位或算术移位运算符,因为它插入的位与符号位相同。
这是最左边的位,值为正时是 0,为负时是 1。
使用<<向左移时,总是在右侧插入 0。
// Shift 2 places to the right preserves the sign
// The binary value is two's complement of 0b0000_0110 (or 0x00000026), so the binary representation will be
// 1000_0000_0000_0000_0000_0000_0010_0110
int value = -0x7FFFFFDA;
// Shift two places to the right, preserving the sign bit
value >> 2;
// # => 1110_0000_0000_0000_0000_0000_0000_1001
如果向右移时需要插入 0,则应改用>>>。移位时插入 0 也称为逻辑移位。
// Shift two places to the right, inserting 0s on the left
value >>> 2;
// # => 0010_0000_0000_0000_0000_0000_0000_1001
按位与(&)运算符接受两个值,对每一位执行与运算。
它把第一个值的每一位与第二个值中相同位置的位进行比较。
如果两者都是 1,结果的该位就是 1。
否则,结果的该位是 0。
0b0110_0101 & 0b0011_1100;
// # => 0b0010_0100
按位或(|)运算符接受两个值,对每一位执行或运算。
它把第一个值的每一位与第二个值中相同位置的位进行比较。
只要其中一位是 1,结果的该位就是 1。
否则就是 0。
0b0110_0101 | 0b0011_1100;
// # => 0b0111_1101
按位异或运算符(^)对两个值执行按位异或。
与按位与和按位或运算符一样,它把第一个值的每一位与第二个值中相同位置的位进行比较。
如果只有其中一位是 1,结果位就是 1。
否则就是 0。
0b0110_0101 ^ 0b0011_1100;
// # => 0b0101_1001
~)最后,按位非运算符(~)会翻转每一位。
与前面的运算符不同,这是一元运算符,只作用于一个值。
~0b0110_0101;
// # => 0b1001_1010