我想使用按位运算符,特别想要进行循环按位移位。所以说我有号码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);
方法,它做了同样的事情。我在这里缺少什么?
答案 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
(前两个零被丢弃)。