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

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位才有用。

你可能感兴趣的:(JAVA)