在java中打印二进制形式的字节==&引用;不工作?

在java中打印二进制形式的字节==&引用;不工作?,java,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++) {

首先,我知道你可以使用方法来打印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;
    }

}
公共静态无效打印二进制文件(int n){
int-mask=n;
mask=mask^~mask;//确保mask是1111。。。
掩码=掩码>>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){
字节掩码=n;
掩码=(字节)(掩码^~掩码);
掩码=(字节)(掩码>>1);
}
}
我得到的结果是,不管n的值是多少,都是0000。为什么布尔运算符==似乎没有按预期工作?或许这并不是我所怀疑的问题


有什么想法吗?

您正在为较低的7位设置掩码为零,因此当您使用介于0和127之间的数字进行此设置时,您将始终得到0

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


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

您将掩码设置为低7位的零,因此当您使用介于0和127之间的数字执行此操作时,您将始终得到0

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


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

首先,您不需要将“mask=n”设置为第一步,因为您真正关心的是mask=~0


事实上,你不在乎面具=~0。您只关心设置了最高位。这意味着您需要mask=1首先,您不需要将“mask=n”设置为第一步,因为您真正关心的是mask=~0


事实上,你不在乎面具=~0。您只关心设置了最高位。这意味着您需要mask=1问题实际上是这条线没有达到您的目的:

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
。所以现在,如果
n
的两个高位都已设置,则只打印
1

要解决此问题,您需要通过写入
&0b1111\u 1111
来“屏蔽”隐式
maskInt的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);

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

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
。所以现在,如果
n
的两个高位都已设置,则只打印
1

要解决此问题,您需要通过写入
&0b1111\u 1111
来“屏蔽”隐式
maskInt的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);

第一个想法是使用调试器逐步完成,并查看您的值,确保它们按照您的期望执行。我目前只使用控制台。然而,在for循环的每次迭代中打印出掩码,我得到-128、-64、-32、-16、-8、-2、-1。似乎在一个字节上,无符号右移并不像预期的那样工作。这似乎不太正确。你应该得到-128、+64、+32、+16、+8、+4、+1确切地说,它与integer方法配合得很好,奇怪。第一个想法是使用调试器逐步完成它,查看你的值,确保它们按照你的预期进行。我目前只使用控制台。然而,在for循环的每次迭代中打印出掩码,我得到-128、-64、-32、-16、-8、-2、-1。似乎在一个字节上,无符号右移并不像预期的那样工作。这似乎不太正确。你应该得到-128、+64、+32、+16、+8、+4、+1确切地说,整数方法的效果非常好,奇怪。哦,我完全理解现在发生的事情,谢谢。)谢谢,现在效果很好,我不太清楚0xFF的意思是什么?我理解它的作用,但不理解它的方式,也不理解它的符号含义。@NylePudding:噢,对不起
0xFF
是一个整数文本(=整数常量的源代码表示),就像
12
1_000_000
一样,但
0x
前缀表示它是十六进制(以16为基数),而不是通常的十进制(以10为基数)
F
是15的十六进制符号,因此
0xFF
是15*16+15=255。由于您还不习惯使用十六进制,您可能更喜欢使用二进制,方法是编写
0b1111_1111
。我会相应地修改我的答案。哦,我完全明白现在发生了什么,谢谢。)谢谢,现在效果很好,我不太清楚0xFF的意思是什么?我理解它的作用,但不理解它的方式,也不理解它的符号含义。@NylePudding:噢,对不起
0xFF
是一个整数文本(=整数常量的源代码表示),就像
12
1_000_000
一样,但
0x
前缀表示它是十六进制(以16为基数),而不是通常的十进制(以10为基数)
F
是15的十六进制符号,因此
0xFF
是15*16+15=255。由于您还不习惯使用十六进制,您可能更喜欢使用二进制,方法是编写
0b1111_1111
。我将相应地编辑我的答案。Re:“你想要的是不要重新发明轮子”:胡说八道。问题的第一句话是“首先,我知道你可以使用方法来打印java中的二进制表示,我只是想自己做一个有趣的事情。”如果你不这么认为的话