【发布时间】:2016-08-13 10:03:39
【问题描述】:
当我尝试对 Java 8 上的硬编码和非硬编码数据执行这些操作时,我遇到了一些奇怪的无符号右移操作,产生了错误的结果。
我正在尝试对有符号字节 0xBF 执行无符号右移。如果我只是将有符号字节分配给一个变量,然后使用该变量执行无符号右移操作,我最终会得到0xDF。如果我将 0xBF 硬编码到无符号右移操作中,我会得到 0x5F。
byte originalByte = (byte) 0xBF;
System.out.println("Original Data: " + toHexString(new byte[]{originalByte}));
byte rotatedByte = (byte) (originalByte >>> 1);
System.out.println("Rotated Data: " + toHexString(new byte[]{rotatedByte}));
byte signRemoved = (byte) (0xBF >>> 1);
System.out.println("Sign Removed Data: " + toHexString(new byte[]{signRemoved}));
上述 Java 调用的输出。
Original Data: BF
Rotated Data: DF
Sign Removed Data: 5F
我应该如何解决上述问题?
【问题讨论】:
-
Java 中的“无符号右移”有点用词不当。移位的值仍然是有符号的,但符号位被移位并替换为零。因此,如果您将
byte与int进行移位,则会有所不同,因为符号位位于不同的位置。