我想尝试一下按位运算符,并且特别想进行循环按位移位。假设我的号码是 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();
}
关于java - 位循环移位仅显示一堆零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47202669/