首先,我知道您可以使用方法来打印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] 删除。
我来说两句