首页 > 解决方案 > 带括号的右移运算符

问题描述

我不明白为什么这段代码有区别:

byte b = (byte) (0xff >> 1);

(所以现在 b = 01111111),

这个代码:

byte b = (byte) 0xff;

b >>= 1;

(但现在 b = 11111111)。

在此先感谢您的帮助!

标签: javabit-manipulation

解决方案


在第一个代码中,(0xff >> 1)是 255 >> 1,即 127。这是用整数计算的,然后将其转换为一个字节。127 作为一个字节是01111111bin。


在第二个代码中,您从 开始(byte) 0xff,即11111111bin,它是 8 位中 -1 的二进制补码表示。(byte) 0xff-1也是如此。

当您执行移位时,字节值-1被提升为 int 值-1。那是11111111 11111111 11111111 11111111斌。

使用算术右移运算符将其右移一位,再次(-1) >> 1给您11111111 11111111 11111111 11111111,因为>>负数上的运算符将位向右移动并用一而不是零填充左侧。

然后,由于您使用>>=的是 ,结果将被转换回一个字节以存储在b. 那只保留最后 8 位,即11111111.

或者,如果您使用逻辑右移运算符(-1) >>> 1将给您01111111 11111111 11111111 11111111二进制(一个零,后跟 31 个)。11111111由于最后 8 位是相同的,所以当它被转换回一个字节时,它仍然会给你。


推荐阅读