位循环移位只是显示一堆零
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
(前两个零被丢弃)。
我想尝试使用按位运算符,特别是想进行循环按位移位。所以说我有数字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
(前两个零被丢弃)。