java - Java中字节移位的奇怪行为

标签 java byte bitwise-operators bit-shift binary-operators

当我在 byte 上使用位移位时,我注意到在使用无符号右移 (>>>) 时我得到了奇怪的结果。使用 int,右移(signed:>>> 和 unsigned:>>>)的行为都符合预期:

    int min1 = Integer.MIN_VALUE>>31; //min1 = -1
    int min2 = Integer.MIN_VALUE>>>31; //min2 = 1

但是当我对 byte 做同样的事情时,无符号右移会发生奇怪的事情:

    byte b1 = Byte.MIN_VALUE; //b1 = -128
    b1 >>= 7; //b1 = -1

    byte b2 = Byte.MIN_VALUE; //b2 = -128
    b2 >>>= 7; //b2 = -1; NOT 1!
    b2 >>>= 8; //b2 = -1; NOT 0!

我认为可能是编译器在内部将 byte 转换为 int,但似乎不足以解释该行为。

为什么 Java 中的字节移位会以这种方式运行?

最佳答案

这正是因为 bytepromotedint 之前执行按位运算。 int -128 表示为:

11111111 11111111 11111111 10000000

因此,右移 7 或 8 位仍然保留第 7 位 1,因此结果为 narrowed为负 byte 值。

比较:

System.out.println((byte) (b >>> 7));           // -1
System.out.println((byte) ((b & 0xFF) >>> 7));  //  1

通过 b & 0xFF,所有最高位在移位之前被清除,因此结果如预期的那样产生。

关于java - Java中字节移位的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36454932/

相关文章:

java - 将参数从 java 传递到 groovy

Java byte[] 到/从 String 转换

java - 仅通过知道异或加密的字节数组和 key 大小来获取 key 字符串

java - 在Java中获取无符号字节

php - 什么时候应该使用按位运算符?

javascript - 位掩码 (javascript) : how to check ALL flags

java - 玩!将 UI 值绑定(bind)到模型

java - 将 ImageView 位图设置为返回的位图

java - 使用带有 spring 的 import.sql 将图像存储为 byte[]

JavaScript 按位掩码