首页 > 解决方案 > 无符号右移运算符用作正常的右移运算符,为什么?

问题描述

当我在 java 中使用无符号右移(逻辑移位)运算符时,我得到的结果与普通右移运算符给出的结果相同。我的代码是:

        byte b1 = -99; // 01100011
        byte result = (byte) (b1 >>> 6);
        String  str = String.format("%8s", Integer.toBinaryString(result & 0xFF)).replace(' ', '0');
        System.out.println("result: " + result); 

前面的代码使用 of>>>>>运算符产生相同的输出,即 -13,这背后的原因是什么以及如何解决它?

标签: java

解决方案


首先,byte在 Java 中是有符号类型,并且位移(无论是普通的还是带符号扩展的)都是在 中完成的int,所以在执行位移之前,将 的值b1隐式转换回 int (保留符号)。(顺便说一句,值 -99 不是 01100011,而是 1001 1101 inbyte和 1111 1111 1111 1111 1111 1111 1001 1101 in int)。

使用b >> 6(or -99 >> 6) 时,值为 -2 (1111 1111 1111 1111 1111 1111 1111 1110),使用b >>> 6(or -99 >>> 6) 时,inint值为 67108862 (0000 0011 1111 1111 1111 1111 1111 1110)。但是,当您随后转换为 时byte,最后一个值也变为 -2 (1111 1110)。

您需要做的是确保在移位之前将字节的无符号值作为整数值:

byte result = (byte) ((b1 & 0xFF) >>> 6);

结果为2。


推荐阅读