Java中的移位运算符包括左移位(<<)、右移位(>>)和无符号右移位(>>>)三种。
- 左移位(<<) 左移位运算符将一个数向左移动指定的位数,右边用0填充。例如,将数字2左移2位,结果为8(二进制表示为"000010",左移后变成"001000",即十进制的8)。
示例代码:
java复制代码int a = 2; // 二进制表示为"000010"
int b = a << 2; // 将a左移2位,结果为8(二进制表示为"001000")
- 右移位(>>) 右移位运算符将一个数向右移动指定的位数,左边用原来的符号位填充。例如,将数字-8右移2位,结果为-2(二进制表示为"11111111111111111111111111111010",右移两位后变成"11111111111111111111111111111110",即十进制的-2)。
示例代码:
java复制代码int a = -8; // 二进制表示为"11111111111111111111111111111000"
int b = a >> 2; // 将a右移2位,结果为-2(二进制表示为"11111111111111111111111111111110")
- 无符号右移位(>>>) 无符号右移位运算符将一个数向右移动指定的位数,左边用0填充。例如,将数字-8无符号右移2位,结果为1073741822(二进制表示为"11111111111111111111111111111010",无符号右移两位后变成"00111111111111111111111111111110",即十进制的1073741822)。
示例代码:
java复制代码int a = -8; // 二进制表示为"11111111111111111111111111111000"
int b = a >>> 2; // 将a无符号右移2位,结果为1073741822(二进制表示为"00111111111111111111111111111110")
需要注意的是,对于负数进行右移位操作时,不同的编译器和处理器可能采用不同的实现方式,结果也可能不同。因此,在进行位运算时,应尽量避免使用负数。