位循环移位只显示一堆零

时间:2017-11-09 13:07:44

标签: java bitwise-operators

我想使用按位运算符,特别想要进行循环按位移位。所以说我有号码101。向左移动1步应该导致011。现在,当我在Java中尝试这个例子时,它只显示了一堆零,如下所示:

//Circular right shift
private static void testCircular() {
    int x = 37;
    System.out.println(x + " Is " + Integer.toBinaryString(x));

    x = (x >>> 8) | (x << (Integer.SIZE - 8));

    System.out.println(x + " Is " + Integer.toBinaryString(x));
}

这给了我以下结果:

37 Is 100101
620756992 Is 100101000000000000000000000000

正如你所看到的,它巧妙地添加了尾随零,而不是任何东西。我也尝试了state = Integer.rotateRight(state,8);方法,它做了同样的事情。我在这里缺少什么?

2 个答案:

答案 0 :(得分:2)

我认为它按预期工作,你缺少的是数字的完整表示 - 当你打印它时在开头跳过零。整数以32位存储,因此完整表示如下所示:

int x = 37;
00000000000000000000000000100101

x = (x >>> 8) | (x << (Integer.SIZE - 8));
00100101000000000000000000000000

修改

这是获取整数的完整字符串表示的方法:

public static String toBinaryStringWithLeadingZeros(int x) {
    StringBuffer buf = new StringBuffer(32);
    char[] arr = new char[Integer.numberOfLeadingZeros(x)];
    Arrays.fill(arr, '0');
    buf.append(arr);
    buf.append(Integer.toBinaryString(x));
    return buf.toString();
}

答案 1 :(得分:0)

您的代码和Integer.rotateRight(state,8);会给出相同的结果并按预期工作。 java中的int是4个字节,因此100101实际上是:

00000000000000000000000000100101

当您将其向右旋转8次时,您将获得:

00100101000000000000000000000000

Integer.toBinaryString(x))会丢弃前导零,因此您看到的是第一种情况下的100101和第二种情况中的100101000000000000000000000000(前两个零被丢弃)。