首页 > 解决方案 > 为什么我会为 >> 运算符得到这个意外的结果?

问题描述

我有一个很长的代码:

long binary = 0b1L<< 63;

这给出了预期的结果,即第 63 个索引处的结果:

1000000000000000000000000000000000000000000000000000000000000000

但是当我花了这么长时间,并将 >> 运算符应用于它时,它给了我一个意想不到的结果。例如,当我在上述二进制文件上调用此代码片段时:

long newBinary = binary >>8;

它向右移动了正确的数量,但它用 1 填充了前导零:

1111111110000000000000000000000000000000000000000000000000000000

发生这种情况是否有特定原因?

标签: javabit-manipulationbitbit-shift

解决方案


>>是有符号右移运算符,每次用符号位(原数的最左边位)填充最左边的位置。另一方面,无符号右移运算符>>>总是用 填充0

脚步:

1000000000000000000000000000000000000000000000000000000000000000

右移 8 个位置:

000000001000000000000000000000000000000000000000000000000000000

用原始符号位 (1) 填充左侧的移位位:

111111111000000000000000000000000000000000000000000000000000000

另请参阅:按位和位移运算符


推荐阅读