比特转移练习

时间:2014-01-24 03:03:33

标签: java bit bit-shift

任务是从键盘读取一个整数,将其转换为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

为什么它无法正常工作?

感谢。

2 个答案:

答案 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;
}