Java中的 << , >> , 和 >>>所代表的含义
标题 Java中的 << , >> , 和 >>>所代表的含义
1.<<表示左移运算符
例如8<<1,表示将8向左移1位,低位补0,结果为16。
例如8<<2,表示将8向左移2位,低位补0,结果为32。
左移一位相当于乘以二
二进制演算:
8的二进制:1 0 0 0
向左移动两位结果为1 0 0 0 0 0,换算成十进制即为32,左移就是将数变大
2.>>表示右移运算符
例如 8>>1,表示将8向右移动1位,结果为4。高位补0。
例如 8>>2,表示将8向右移动2位,结果为2。高位补0。
右移一位相当于除以二
二进制演算:
8的二进制:1 0 0 0
向右移动两位:0 0 1 0即为2,右移就是将数变小
3.>>>表示无符号右移运算符。高位补0
例如8>>>2表示将8向右移位2位,结果为2。
这个在正数时也可以和右移运算符一起理解。
但是在负数时就不一样了
举个例子:
将15右移无符号右移两位: 15>>>2
15的二进制是:1 1 1 1,右移两位变为 :0 0 1 1 ,转换成二进制为:3
那么-15>>>2 又是多少呢?,先求得-15的二进制,往下看
Demo:求-15>>2 和 -15>>>2
解释:一个是带符号右移两位,一个是无符号右移两位。
区别:看下面的讲解基本就明白了!
一个二进制的正数的原码和反码和补码是相同的,负数就不一样了。
要知道一个完整的二进制是由32位表示的
- -15的完整二进制为:
10000000 00000000 00000000 00001111 - -15的反码为:
11111111 11111111 11111111 11110000 (反码:将二进制数除符号位外取反,所得的新二进制数为反码) - -15的补码为:
11111111 11111111 11111111 11110001 (补码:反码加1称为补码。也就是说,要得到一个数的补码,先得到反码,然后将反码最右边的位加上1即为补码。)
-
求-15>>2
将-15的补码带符号右移两位
-15的补码为:
11111111 11111111 11111111 11110001
将-15的补码带符号右移两位:
11111111 11111111 11111111 11111100
不懂看图解
图解:
看我圈住的红色部分,将红色部分那块右移两位到最右边(最右边两个被替换覆盖),左边空出的两个高位补1,这就是带符号右移求值:
将补码无符号右移后的结果保留符号位其余的位取反:
10000000 00000000 00000000 00000011
然后+1,即为最后的结果:
10000000 00000000 00000000 00000100
结果为-4 -
求-15>>>2
将-15的补码无符号右移两位
-15的补码为:
11111111 11111111 11111111 11110001
将-15的补码无符号右移两位:
00111111 11111111 11111111 11111100图解
看我圈住的红色部分,将红色部分那块右移两位到最右边(最右边两个被替换覆盖),左边空出的两个高位补0,这就是无符号右移求值:
将-15的补码无符号右移两位后直接求结果:
00111111 11111111 11111111 11111100
结果为:1073741820验证:
总结:
- 正数的左右移管它是有符号还是无符号,直接在原码的基础上移动,并求结果就好了
- 负数的左右移区别在有符号左右移和无符号左右移
有符号的左右移: 第一步 — 求出负数的补码 ,第二步 — 将补码左右移,第三步 — 高位不变其余取反,最后一位再加1
无符号的左右移: 第一步 — 求出负数的补码 ,第二步 — 将补码左右移,第三步 — 直接求结果