位循环移位只是显示一堆零

Bit circular shift just shows a bunch of zeros

我想尝试使用按位运算符,特别是想进行循环按位移位。所以说我有数字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); 方法,它做同样的事情。我在这里错过了什么?

我认为它按预期工作,您缺少的是以位为单位的数字的完整表示 - 当您打印它时,它会在开头跳过零。整数以 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();
}

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

00000000000000000000000000100101

当你向右移动 8 次时,你得到:

00100101000000000000000000000000

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