Java – 使用按位运算的循环移位
我想知道如何用int
位表示的位串实现循环右移。
public int rtCircShift(int bits, int k) { return bits >> k; }
所有这些代码都返回0 ,我怎样才能使它成为循环移位?
这应该工作:
return (bits >>> k) | (bits << (Integer.SIZE - k));
另请参阅维基百科有关循环转换的文章 。
你的意思是你希望从右侧旋转的位出现在左侧?
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
schnaader 的答案是正确的:
return (bits >>> k) | (bits << (32-k));
- 第一部分
(bits >>> k)
将存储bits
的值右移k
位,'第三>
'确保最左边的位为零,而不是bits
的符号 - 第二部分
(bits << (32-k))
将bits
左移位k
补码位数
现在,您有两个临时变量,其中第一个(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”。