java 有三种移位运算符:
符号 | 作用 |
---|---|
<< | 左移运算符,不分正负数,低位补 0 |
>> | 右移运算符,该数为正,则高位补 0,若为负数,则高位补 1 |
>>> | 无符号右移运算符,忽略符号位,空位都用 0 来补齐 |
<< 左移运算符
表示左移移,不分正负数,低位补 0,假设数据类型默认为 8 位。
正数:n = 20 << 2
20 的二进制补码:0001 0100
补码向左移动两位:0101 0000
结果:n = 80;
负数:n = -20 << 2
-20 的二进制补码:1110 1100
补码向左移动两位:1011 0000
结果:n = -80
正数的原码、反码、补码相同,负数的补码为反码最低位 +1。
>>右移运算符
表示右移,如果该数为正,则高位补 0,若为负数,则高位补 1,假设数据类型默认为 8 位。
正数:n = 20 >> 2
20 的二进制补码:0001 0100
补码向右移动两位:0000 0101
结果:n = 5;
负数:n = -20 >> 2
-20 的二进制补码:1110 1100
补码向右移动两位:1111 1011
结果:n = -5
>>>无符号右移运算符
表示无符号右移,也叫逻辑右移,即若该数为正,则高位补 0,而若该数为负数,则右移后高位同样补 0,假设数据类型默认为 8 位。
正数:n = 20 >>> 2
20 的二进制补码:0001 0100
补码向右移动两位:0000 0101
结果:n = 5,同 n >> 2 结果相同;
负数:n = -20 >>> 2
-20 的二进制补码:1110 1100
补码向右移动两位:0011 1011
结果:n = 59