2021-03-24 Java中的>>,<<,>>>区别?

2023-05-16

  1. 基本概念: 计算机都是操作数据的补码,而对于正数,原码(第一位为符号位,0表正数,1表负数),反码,补码都是一样的,而对于负数而言,反码是原码除了符号位的取反,补码则是在反码的基础上加1,有进位则进位,但不改变符号位
  2. 对于一个八位的二进制数据,所能表示的范围就是-128~127(即除了符号位之后还有7个bit,每个bit都有0和1两种可能,所以负数最小的取值的绝对值就是2的7次方,正数最大的取值的绝对值也是2的7次方-1),至于为什么是2的7次方-1,可以参阅这位老哥的文章或者其他大佬的文章

1.<<,左移,不分正负数,低位补0
比如:

对于一个正数1,补码为:   00000001:1*20次方=1
进行左移2位之后:       00000100:1*22次方=4
对比值 两者相差22次方,所以左移n位就乘以2的n次方

2.>>,右移,正数高位补0,负数高位补1
比如:
Ⅰ. 正数右移:

对于一个正数4,其补码为:00000100:1*22次方=4
进行右移2位后为:      00000001: 1
对比值 两者相差22次方,所以右移n位就除以2的n次方

Ⅱ.负数右移

对于负数-4,其原码为:                       10000100
除了符号位,其他位取反,01,10,所以反码为: 11111011
反码末位+1,所以补码为:                      11111100
由于位运算操作的是补码,右移2位之后:           11111111
对于操作之后的补码转化为反码,末尾-1:          11111110
又从反码获取原码,符号位不变,其余取反:         10000001
所以得到的数值为:    -1                             

上面负数右移得到的结论同样是右移n位就除以2的n次方,而对于无符号右移就不同了

3.无符号右移>>>又叫作逻辑右移,无论正负数,高位均补0
无符号右移针对于正数和>>无异

负数无符号右移示例(以8bit为例,在java中int类型是32bit,逻辑右移算出来的值很大):

-4补码:                        11111100
无符号右移2:                  00111111
将操作完毕之后的补码转化为原码:   01000001

所以对于负数,>>>和 >> 区别还是很大的

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2021-03-24 Java中的>>,<<,>>>区别? 的相关文章

随机推荐