首先我知道你可以使用方法在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.为什么布尔运算符==似乎没有按预期工作?或者也许这不是我怀疑的问题。
有什么想法吗?
答案 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进行比较,则应始终为!=
应该有帮助的是在调试器中逐步执行代码以查看每行代码的作用。