3

我正在了解如何>>>工作。为此,我有这个程序:

public class Main {
    public static void main(String[] args) 
    {
        short i = 130;
        byte b = (byte)i;
        String a = Integer.toBinaryString(256 + (int) b);
        System.out.println(Integer.toBinaryString(i));
        System.out.println(a.substring(a.length() -8));
        System.out.println(b);

        byte c = (byte) (b >>> 2);
        String x = Integer.toBinaryString(256 + (int) c);

        System.out.println(x.substring(x.length() -8));
        System.out.println(c);
    }
}

我得到这个输出:

10000010
10000010
-126
11100000
-32

为了显示为二进制,我在这里找到了如何将字节显示为二进制字符串。

运算符>>>将添加零,但我明白了:

-126
11100000
-63

代替:

-126
10100000
-32

它添加了 1 而不是 0:

11100000
10100000

我究竟做错了什么?也许我什么都不懂。

4

1 回答 1

9

问题是b >>> 2首先提升b为值为-126的int,即

11111111 11111111 11111111 10000010

当您使用零扩展将其右移 2 时,您会得到:

00111111 11111111 11111111 11100000

然后将其转换回一个字节时,它只会删除前三个单词,给出 11100000,这就是您所看到的。

有关位移的更多详细信息,请参阅JLS 的第 15.19 节。

于 2012-07-17T16:37:35.803 回答