java中有三种移位运算符
操作符 | 说明 | 举例 |
---|---|---|
<< | 左移运算符 | num << 1,相当于 num 乘以 2 |
>> | 右移运算符 | num >> 1,相当于 num 除以 2 |
>>> | 无符号右移 | 忽略符号位,空位都以 0 补齐 |
为什么没有 无符号左移 ( <<< ) ?
因为左移是在后面补 0,而右移是在前面边补 1 或 0 ;
有无符号是取决于数的前面的第一位是 0 还 是1 ,
所以右移是会产生到底补 1 还是 0 的问题。
而左移始终是在右边补,不会产生符号问题。
所以无符号左移 <<< 和左移 << 是一样的概念,没有必要额外的无符号左移 <<<。
移位运算4个字总结就是“左乘右除”
但并不是说一定是乘除,只是给出一种快速记忆的方法,具体结果怎样,还要看具体运算。如下面的例子。
1、左移:<<
例 1.1:2 << 2
操作数:2 | 移位:2 |
---|---|
二进制 | 0010 |
左移 2 位 | 1000 |
运算结果 | 8 |
相当于 |
例 1.2:-2 << 2
操作数:-2 | 移位:2 |
---|---|
原码(正 2 的二进制) | 0000....0010 |
反码(原码按位取反) | 1111....1101 |
补码(反码符号位不变,末位 + 1) | 1111....1110 |
左移 2 位 | 1111....1000 |
符号位固定,其他位取反 | 1000....0111 |
符号位固定,最低位 +1 | 1000....1000 |
运算结果 | -8 |
相当于 |
例 1.3:3 << 2
操作数:3 | 移位:2 |
---|---|
二进制 | 0011 |
左移 2 位 | 1100 |
运算结果 | 12 |
相当于 |
小结:
移位运算 num << n 相当于
2、右移:>>
例 2.1:4 >> 2
操作数:4 | 移位:2 |
---|---|
二进制 | 0100 |
右移 2 位 | 0001 |
运算结果 | 1 |
相当于 |
例 2.2:-4 >> 2
操作数:-4 | 移位:2 |
---|---|
原码(正 4 的二进制) | 0000....0100 |
反码(原码按位取反) | 1111....1011 |
补码(反码符号位不变,末位 + 1) | 1111....1100 |
右移 2 位 | 1111....1111 |
符号位固定,其他位取反 | 1000....0000 |
符号位固定,末位 +1 | 1000....0001 |
运算结果 | -1 |
相当于 |
例 2.3:7 >> 2
操作数:7 | 移位:2 |
---|---|
二进制 | 0111 |
右移 2 位 | 0001 |
运算结果 | 1 |
相当于 | 显然结果不是 |
例 2.3:-7 >> 2
操作数:-7 | 移位:2 |
---|---|
原码(正 7 的二进制) | 0000....0111 |
反码(原码按位取反) | 1111....1000 |
补码(反码符号位不变,末位 + 1) | 1111....1001 |
右移 2 位 | 1111....1110 |
符号位固定,其他位取反 | 1000....0001 |
符号位固定,末位 +1 | 1000....0010 |
运算结果 | -2 |
相当于 | 显然结果不是 |
这里就解释了上面一直说“相当于”的问题,因为移位运算是操作的二进制位,恰巧看起来像乘除
而已。
小结:
,但并不是等于。
移位运算 num >> n 相当于
3、无符号右移:>>>
例 3.1:8 >>> 2
操作数:8 | 移位:2 |
---|---|
二进制 | 0000....1000 |
右移 2 位 | 0000....0010 |
运算结果 | 1 |
相当于 |
例 3.2:7 >>> 2
操作数:7 | 移位:2 |
---|---|
二进制 | 0000....0111 |
带符号位右移 2 位 | 0000....0001 |
运算结果 | 1 |
相当于 | 显然结果不是 |
例 3.2:-8 >>> 2
操作数:-8 | 移位:2 |
---|---|
原码(正 8 的二进制) | 0000....1000 |
反码(原码按位取反) | 1111....0111 |
补码(反码符号位不变,末位 + 1) | 1111....1000 |
带符号位右移 2 位 | 0011....1110 |
运算结果 | 1073741822 |
相当于 | 显然结果不是 |
小结:
当操作数是正数,那么 >>、>>> 都是一样的,相当于但不等于
当操作数是负数,那么 >>、>>> 的结果将出现很大差异,而且 >>> 的结果一般都会变为正数。
因此要慎重使用 >>> 运算!
网友评论