在Java中打印字节的二进制形式,“ ==”不起作用?

尼龙布丁

首先,我知道您可以使用方法来打印Java中的二进制表示形式,我只是想自己做些有趣的事情。

我已经设法用下面的代码对整数进行了处理。

public static void printBinary(int n) {

    int mask = n;
    mask = mask ^ ~mask;    //make sure mask is 1111...
    mask = mask << 31;

    for (int i = 0; i < 32; i++) {

        int test = mask & n;

        if (test == mask) {

            System.out.print("1");
        }
        else {
            System.out.print("0");
        }

        if ((i + 1) % 4 == 0) {
            System.out.print(" ");
        }

        mask = mask >>> 1;
    }

}

我以为字节不会有太大的不同,所以我对字节进行了此方法:

public static void printBinary(byte n) {
    byte mask = n;
    mask = (byte) (mask ^ ~mask);
    mask = (byte) (mask << 7);


    for (int i = 0; i < 8; i++) {

        byte test = (byte) (mask & n);

        if (test == mask) {
            System.out.print("1");
        }
        else {
            System.out.print("0");
        }

        if ((i + 1) % 4 == 0) {
            System.out.print(" ");
        }

        mask = (byte) (mask >>> 1);
    }
}

无论n的值是0000 0000还是多少,我得到的结果都是如此。布尔运算符==怎么似乎没有按预期工作?也许这不是我怀疑的问题。

有任何想法吗?

鲁阿赫

问题实际上是此行无法实现您的预​​期目的:

mask = (byte) (mask >>> 1);

算术是对整数的运算,因此运算>>>发生在符号扩展之后。我们可以用这种方式重写该表达式,以使问题更加清楚:

// assume that mask is initially 1000 0000

int maskInt = (int) mask;   // maskInt is 1111 1111 1111 ... 1111 1000 0000
maskInt = maskInt >>> 1;    // maskInt is 0111 1111 1111 ... 1111 1100 0000
mask = (byte) maskInt;      // mask is 1100 0000

有一个额外的领导1因此,现在您仅同时设置1两个高位的情况下才打印n

要解决此问题,您需要maskInt通过写入来“屏蔽”隐式的24个高位& 0b1111_1111将其添加到上面的代码段中,我们将:

int maskInt = (int) mask;         // maskInt is 1111 1111 1111 ... 1111 1000 0000
maskInt = maskInt & 0b1111_1111;  // maskInt is 0000 0000 0000 ... 0000 1000 0000
maskInt = maskInt >>> 1;          // maskInt is 0000 0000 0000 ... 0000 0100 0000
mask = (byte) maskInt;            // mask is 0100 0000

把它放回表达式形式:

mask = (byte) ((mask & 0b1111_1111) >>> 1);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章