在java中打印二进制形式的字节==&引用;不工作?
首先,我知道你可以使用方法来打印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++) {
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中的二进制表示,我只是想自己做一个有趣的事情。”如果你不这么认为的话