[Java] 移位运算1

2017-05-08  本文已影响197人  灰灰手记
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
相当于 显然结果不是

小结:
当操作数是正数,那么 >>、>>> 都是一样的,相当于但不等于


当操作数是负数,那么 >>、>>> 的结果将出现很大差异,而且 >>> 的结果一般都会变为正数。
因此要慎重使用 >>> 运算

[Java] 移位运算2,你可能不知道的运算

上一篇 下一篇

猜你喜欢

热点阅读