任务是从键盘读取一个整数,将其转换为8组4位,然后将每个位转换为十六进制数并逐个输出。这必须通过使用位移来完成,没有其他解决方案计数。
我的想法是使用一个带有4个的掩码来选择位组,然后将该组右移,删除前面的零,并以十六进制输出数字。
以下是我尝试解决此问题的方法:
public static void main(String args[]) {
Scanner input = new Scanner(System.in);
System.out.print("Enter an integer: ");
int x = input.nextInt();
System.out.println("Binary representation: " + Integer.toBinaryString(x));
System.out.println("Hexadecimal representatio1n: " + Integer.toHexString(x));
int mask = 15 << 28;
System.out.println(Integer.toBinaryString(mask));
int k = 28;
for (int i = 1; i <= 8; i++)
{
int result = mask & x;
//System.out.println(Integer.toBinaryString(result));
result = x >>> k ;
mask = mask >> 4;
k = k - 4;
System.out.println(Integer.toHexString(result));
}
}
示例输出:
Enter an integer: 324234234
Binary representation: 10011010100110110101111111010
Hexadecimal representatio1n: 13536bfa
11110000000000000000000000000000
1
13
135
1353
13536
13536b
13536bf
13536bfa
为什么它无法正常工作?
感谢。
答案 0 :(得分:0)
因为Java中没有无符号类型,所以在int mask = 15 << 28;
行上你通过将位移到符号字段实际上使你的mask
为负。稍后您将其向左移动mask = mask >> 4;
,从而将符号位向下移动。轮班后,您的面具不是00001111000000000000000000000000
,而是11111111000000000000000000000000
。改为使用逻辑右移运算符>>>
。
PS。这看起来像是一个功课。在这种情况下,提问的人应使用homework
标记来标记问题。
答案 1 :(得分:0)
当你移动结果变量时,你没有按结果移动,你将它移动x
如果您将其更改为
result = result >>> k;
它应该有用
另一方面,从另一个方面(从最低有效位到最高有效位),这个问题更容易完成 像
int x = 0xaabcdabcd;
int mask = 0x0fffffff;
for(int i =0;i < 8; i ++){
System.out.println(x & mask);
x = x >>> 4;
}