Java打印二进制数字使用位算子[封闭
-
03-10-2019 - |
题
嗨,我正在创建一种方法,该方法将采用一个数字并将其及其二进制表示形式印刷。问题在于我的方法将所有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();
}
解决方案
您忘了更新口罩:
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;
}
其他提示
这个问题的文本已经被无数次编辑,因此很难说出问题是什么,但是这里有一些评论。
在签名与未签名的班次上
该问题的一个修订包含以下行:
int mask = 1 << 31;
一个答案表明,缺少的是这一行:
mask = mask >> 1;
这实际上行不通,因为 >>
是签名的班次,会导致不正确 mask
为此目的的价值(因为空位填充了 1
S)。任何负数将转换为32位 1
.
需要的是未签名的右班。
mask >>>= 1;
请注意,复合分配已用于简洁。未签名的右班 >>>
填充空位 0
. 。如这里所用,它确保了 mask
将始终只有一个位设置,这就是此问题所需的。
也可以看看
类似的问题
- 使用Java的程序
- 类似的家庭作业
替代解决方案
实际上有一个更简单的解决方案来转换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]"
即使这是作业,这里使用的各种技术仍然应该是教学的。
也可以看看
不隶属于 StackOverflow