Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 位循环移位只显示一组零_Java_Bitwise Operators - Fatal编程技术网

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)检查前导零的数量并编写自己的打印方法。