Java移位操作符:操作数小于0时怎么办?

本文深入探讨了Java中无符号右移操作符(>>>)的使用,特别是当操作数小于0或大于long类型的位数时的行为。通过具体的例子,解释了如何正确理解和计算移位结果。

Java移位操作符:操作数小于0时怎么办?

long a = -1L >>> -7;
long b = 4L >>> 66;

看到上述的计算, 首先想到">>>"是一种"无符号"的右移位操作符, 也就是说无论被操作数是正或负, 向右移位后, 高位补0;但脑海未免还会闪现出如下疑问

  • 向右移动负数个位置, 咋移? 难道是向左移?
  • Java中long是8字节, 也就是最多64位, 那向右移动66位,咋整?
    上面移位的结果是:
a = 127
b = 1

移位详解
下面以上述的long类型进行说明

首先: ">>>"操作符肯定是向右移位, 无论操作数是正或负, 这不能改变操作符的本质

其次: long只有64位(2^6), 那么此时移位操作数, 不管是多大, 只会用到该操作数的右端的低6位, 以防止移位超过long型数具有的位数

那么来看文章开始的两道计算

首先-1L标识为二进制:
1111111111111111111111111111111111111111111111111111111111111111
移位操作 -7的二进制: 
11111111111111111111111111111001

正真有效的移动位数为-7的低6位即:111001, 表示为整数即为57

也就是-1L无符号右移57位, 结果为1111111(表示整数即是127)

同理对4L的操作, 也是一样的道理:66(1000010), 低6位, 即二进制10, 换算成整数即2, 4向右移动两位结果为1。

最后, 还得知道,对char,byte,shrot型移位时, 他们会被转换为int型, 那么一个int表示为4个字节, 即32位, 那么对它的移位, 只有操作数的低5位才有用。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值