您好我正在创建一个方法,它将获取一个数字并将其与二进制表示一起打印。问题是我的方法打印所有0的任何正数,所有1的任何负数
private static void display( int number ){
System.out.print(number + "\t");
int mask = 1 << 31;
for(int i=1; i<=32; i++) {
if( (mask & number) != 0 )
System.out.print(1);
else
System.out.print(0);
if( (i % 4) == 0 )
System.out.print(" ");
}
}
我明白了:这有效:
/**
* prints the 32-bit binary representation of a number
* @param number the number to print
*/
private static void display( int number ){
//display number and a tab
System.out.print(number + "\t");
//shift number 31 bits left
int mask = 1 << 31;
//loop and print either 1 or 0
for(int i=31; i>=0; i--) {
if( ((1 << i)&number) != 0)
System.out.print(1);
else
System.out.print(0);
//every four bits print a space
if( (i % 4) == 0 )
System.out.print(" ");
}
//print new line
System.out.println();
}
答案 0 :(得分:5)
您忘了更新面具:
for(int i=1; i<=32; i++) {
if( (mask & number) != 0 )
System.out.print(1);
else
System.out.print(0);
if( (i % 4) == 0 )
System.out.print(" ");
mask = mask >> 1;
}
答案 1 :(得分:2)
该问题的文本已被多次编辑,因此很难说出问题所在,但这里有一些评论。
该问题的一个修订版包含以下内容:
int mask = 1 << 31;
一个答案表明缺少的是这一行:
mask = mask >> 1;
这实际上不起作用,因为>>
是一个有符号的移位,并且会为此目的导致不正确的mask
值(因为清空的位用1
s填充) 。任何负数都将转换为32位,全部为1
。
需要的是无符号右移。
mask >>>= 1;
请注意,为简洁起见,使用了复合赋值。无符号右移>>>
用0
填充空位。如此处所使用的,它确保mask
始终只有一个位设置,这是此问题所需的。
实际上有一种更简单的解决方案可将32位int
转换为32位,分为4位组。
static String zeroes(int length) {
return (length <= 0) ? ""
: String.format("%0" + length + "d", 0);
}
//...
int num = 8675309;
// convert to binary
String s = Integer.toBinaryString(num);
System.out.println(s);
// prints "100001000101111111101101"
// fill in leading zeroes
s = zeroes(Integer.SIZE - s.length()) + s;
System.out.println(s);
// prints "00000000100001000101111111101101"
s = s.replaceAll("(?!$)(?<=\\G.{4})", " ");
System.out.println("[" + s + "]");
// prints "[0000 0000 1000 0100 0101 1111 1110 1101]"
即使这是作业,这里使用的各种技术仍然应该是教学。