首先区分下每一种代表的意思
a << b 代表将数字a的二进制向左位移b位
a >> b 代表将数字a的二进制带符号向右位移b位
a >>> b 代表将数字a的二进制不带符号向右位移b位
一、a << b
规则:a的二进制整体向左移动b位,在低位补零
(相当于a乘上2的b次方,正负数都可以这样算)
例子
4<<2
计算方式:
首先得到4的二进制
0000 0100
移动后:
0001 0000
结果:16
二、a >> b
规则:a的二进制整体向右移动b位,右边超出部分直接抛弃,左边高位用原符号位补齐
例子(负数)
-5>>2
计算方式:
-5的源码
1000 0000 0000 0000 0000 0000 0000 0101
由于是负数则取反,然后再转换成补码计算
反码:1111 1111 1111 1111 1111 1111 1111 1010
补码:1111 1111 1111 1111 1111 1111 1111 1011
右移后:1111 1111 1111 1111 1111 1111 1111 1110
再通过取补码的反码加补码得出结果
反码 :1000 0000 0000 0000 0000 0000 0000 0001
补码: 1000 0000 0000 0000 0000 0000 0000 0010
结果-2
因为取了两次反所以完全可以用 0000 0101来计算
例子(正数)
5>>2
计算方式:
5的二进制
0000 0101
直接向右移动2位
0000 0001
结果1
三、a>>>b
将数字a的二进制不带符号向右位移b位 高位不管是正负都直接补0
(其实右移n位,就相当于除于2的n次方,如果是负数就用负数的补码的10进制除于2的N次方)
例子
-5>>>2
-5的二进制源码
1000 0000 0000 0000 0000 0000 0000 0101
由于是负数则取反,然后再转换成补码计算
反码:1111 1111 1111 1111 1111 1111 1111 1010
补码:1111 1111 1111 1111 1111 1111 1111 1011
右移后:0011 1111 1111 1111 1111 1111 0011 1110
1073741822再通过取补码的反码加补码得出结果
反码 :0100 0000 0000 0000 0000 0000 0100 0001
补码: 0100 0000 0000 0000 0000 0000 0100 0010 结果1073741822