1

我写了一个函数来打印一个字节的位。这是通过将最高有效位设置为 1 将其与输入字节进行比较,如果它也是 1,则打印“1”,否则为“0”。然后将比较字节右移。

我如何实现从 10000000 开始并转移到 01000000 然后 00100000 ......

我相信我的问题是由提升到 int 然后重铸引起的,但我没有看到解决方案。

package errorreporting;

public class ErrorReporting {

ErrorReporting() {
}

public static void main(String[] args) {

    ErrorReporting myError = new ErrorReporting();
    byte myByte = 16;
    myError.printByteArray(myByte);

}

public void printByteArray(byte inputByte) {
    // print out 1 or 0
    byte comparison = -128;
    for (int x = 0; x < 8; x++) {
        if ((inputByte & comparison) != 0) {
            System.out.print("1");
        } else {
            System.out.print("0");
        }
        //       System.out.print(" comparison : " + comparison);
        comparison = (byte) (comparison >>> 1);

    }
    System.out.println(" : " + inputByte);
}

}

这篇文章有一些信息:Java bitshift陌生

4

1 回答 1

1

我相信我的问题是由提升到 int 然后重铸引起的

是的,它是一些隐式和显式转换和符号扩展的组合:

  1. 在移位操作发生之前,所有参数首先被提升为 int,另请参见https://stackoverflow.com/a/3948303/1611055

  2. 由于 1.,您的无符号移位运算符>>>没有帮助 - 它正确地将 a0移到最左边的位置,但是由于在应用移位之前-128源参数已提升为 int (导致),因此您在第一次移位之后结束.0xffffff800x7fffffc0

最简单的解决方案是使用int你的面具:

int comparison = 0x80;  // -128;

从理论上讲,您仍然可以使用一个字节作为掩码,但是您需要int在应用移位运算符之前将其显式转换为同时丢弃符号位,如下所示:

byte comparison = -128;
...
comparison = (byte)( (((int) comparison) & 0xff) >>> 1);

((int) comparison) & 0xff)假定该字节确实应该是“无符号”并将其转换为相应的“无符号”int 值。然后,您可以应用移位运算符(>>>>>无关紧要,因为我们int在任何情况下都有一个正值)并将其转换回 a byte

于 2013-03-14T10:20:42.823 回答