谁想到在发明Java时应该对字节进行签名的人应该拿出并用湿的芹菜棒打打直到他们哭泣:-)
您可以通过强制转换为int并确保永远不要将1移入最高位来完成所需的操作,如下所示:
byte x = -1;int x2 = ((int)x) & 0xff;for(int i = 0; i < 8; i++){ x2 = (x2 >>> 1); System.out.println("X: " + x2);}您的特定问题是因为>>>强制转换为一个int以进行移位,然后将其强制转换为一个字节,如下所示:
byte x = -1;int x2 = ((int)x) & 0xff;int x3;int x4 = x2;for(int i = 0; i < 8; i++){ x2 = (x2 >>> 1); System.out.println("X2: " + x2); x3 = (x >>> 1); x = (byte)x3; x4 = (x4 >>> 1); System.out.println("X: " + x3 + " " + x + " " + x4);}哪个输出:
X2: 127X: 2147483647 -1 127X2: 63X: 2147483647 -1 63X2: 31X: 2147483647 -1 31X2: 15X: 2147483647 -1 15X2: 7X: 2147483647 -1 7X2: 3X: 2147483647 -1 3X2: 1X: 2147483647 -1 1X2: 0X: 2147483647 -1 0
您可以清楚地看到x和x3不起作用(即使x3正确移位,将其强制转换回x中的字节也会再次将其设置为-1)。x4完美运行。



