我想知道如何实现由int
位表示位串K A 圆形右移循环移位。爪哇 - 使用按位运算
public int rtCircShift(int bits, int k)
{
return bits >> k;
}
所有这些代码所做的就是返回0,我怎样才能使一个循环移位?
我想知道如何实现由int
位表示位串K A 圆形右移循环移位。爪哇 - 使用按位运算
public int rtCircShift(int bits, int k)
{
return bits >> k;
}
所有这些代码所做的就是返回0,我怎样才能使一个循环移位?
你的意思是你想让右边的位旋转出现在左边?
return Integer.rotateRight(bits, k);
实施例:
int n = 0x55005500; // Binary 01010101000000000101010100000000
int k = 13;
System.err.printf("%08x%n", Integer.rotateRight(n, k));
输出:
a802a802 // Binary 10101000000000101010100000000010
The answer通过schnaader是正确的:
return (bits >>> k) | (bits << (32-k));
(bits >>> k)
右移由k
比特存储在bits
的值和“第三>
”确保最左边的位是零,而不是的bits
(bits << (32-k))
通过bits
左移位的值的符号k
比特-complement数现在,有两种临时变量,其中第一(32-k)个比特被存储在VAR(1)的最右位,而最后k个比特被存储在最左var(2)的位。按位或操作将这两个温度变量简单地对齐在一起(注意使用>>>
而不是>>
),并且您有循环移位。
int x=12345,n=5;
System.out.println((x%10)*Math.pow(10, n-1)+(x/10));
要移动一位。
这应做到:
/**
* Rotate v right with k steps
*/
public static int rro(int v, int k) {
return (v >>> (k%32)) | (v << ((k%32)-32)
}
/**
* Rotate v left with k steps
*/
public static int lro(int v, int k) {
return (v << (k%32)) | (v >>> ((k%32)-32)
}
我觉得其他的答案是错误的,因为如果你转移超过32位,他们的算法失败。如果你想要更大的数据类型,你需要在所有地方调整数据类型和'32'。
将逻辑'或'变成按位。 – Femaref 2011-04-30 19:26:01
就是这样,谢谢。 – john 2011-04-30 19:30:31
仍然不正确,你需要使用逻辑右移,'>>>'。坚持这个方法,你有'Integer.rotateRight'。 – rlibby 2011-04-30 19:33:17