在java中打印二进制形式的字节," =="不工作?

时间:2014-12-14 17:49:52

标签: 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.为什么布尔运算符==似乎没有按预期工作?或者也许这不是我怀疑的问题。

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

首先,您不需要设置&#34; mask = n&#34;作为第一步,因为你真正关心的是mask =〜0;

实际上,你并不关心那个面具=〜0。您只关心设置的最高位。这意味着你想要mask = 1&lt;&lt; (加numBits-1);

实际上......你想要的是反过来循环每一位。

for (int i = numBits-1; i >= 0; --i) {
   System.out.print((value & (1 << i) == 0) ? 0 : 1);
}

实际上,你想要的是不要重新发明轮子。

System.out.print(Integer.toString(n, 2));

答案 1 :(得分:2)

问题实际上是这条线没有达到你想要的目的:

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

要解决此问题,您需要&#34;屏蔽&#34;通过编写maskInt,隐式& 0b1111_1111的24个高位。将其添加到上面的代码段中,我们有:

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);

答案 2 :(得分:0)

您正在为较低的7位将屏蔽设置为零,因此当您使用0到127之间的数字&时,您将始终获得0。

如果您的掩码为-128或0b11..11 1000 0000,并将其与值0进行比较,则应始终为!=

应该有帮助的是在调试器中逐步执行代码以查看每行代码的作用。