Java 位循环移位只显示一组零
我想使用逐位运算符,特别想进行循环逐位移位。因此,假设我有编号Java 位循环移位只显示一组零,java,bitwise-operators,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
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));
}
int x = 37;
00000000000000000000000000100101
x = (x >>> 8) | (x << (Integer.SIZE - 8));
00100101000000000000000000000000
正如您所看到的,它只是简单地添加了尾随的零,没有移动任何内容。我还尝试了
state=Integer.rotateRight(state,8)代码>方法,它做同样的事情。我在这里遗漏了什么?我认为它可以像预期的那样工作,您遗漏的是以位表示的数字的完整表示-当您打印时,它在开始时跳过了零。整数以32位存储,因此完整表示形式如下所示:
//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));
}
int x = 37;
00000000000000000000000000100101
x = (x >>> 8) | (x << (Integer.SIZE - 8));
00100101000000000000000000000000
您的代码和Integer.rotateRight(状态,8)代码>给出与预期相同的结果和工作int
是4个字节,因此100101
实际上是:
00000000000000000000000000100101
当您将其向右旋转8次时,您会得到:
00100101000000000000000000000000
Integer.toBinaryString(x))
丢弃前导零,因此第一种情况下看到的是100101
,第二种情况下看到的是100101000000000000000000000000000000000000000000
(丢弃前两个零)。这绝对是正确答案。测试它的简单方法是将“37”移位32次,您将得到原始的“37”。我明白了,二进制字符串没有打印所有的零,这不是有点误导吗?出于我的口味,这可能会误导我,我甚至检查是否有打印完整表示的选项,但我找不到。一个选项是使用Integer.numberOfLeadingZeros(x)检查前导零的数量并编写自己的打印方法。