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

  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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值