Java - 使用按位运算的循环移位

joh*_*ohn 26 java

我想知道如何用位表示的位串实现循环右移int.

public int rtCircShift(int bits, int k)
{
    return bits >> k;
}
Run Code Online (Sandbox Code Playgroud)

所有这些代码都返回0,我怎样才能使它成为循环移位?

fin*_*nnw 37

你的意思是你希望从右侧旋转的位出现在左侧?

return Integer.rotateRight(bits, k);
Run Code Online (Sandbox Code Playgroud)

例:

int n = 0x55005500; // Binary 01010101000000000101010100000000
int k = 13;
System.err.printf("%08x%n", Integer.rotateRight(n, k));
Run Code Online (Sandbox Code Playgroud)

输出:

a802a802 // Binary 10101000000000101010100000000010
Run Code Online (Sandbox Code Playgroud)


sch*_*der 33

这应该工作:

 return (bits >>> k) | (bits << (Integer.SIZE - k));
Run Code Online (Sandbox Code Playgroud)

另请参阅维基百科有关循环转换的文章.

  • +1:你可以做`return(bits >>> k)| (bits << -k);`这将适用于`int`和`long`,因为移位只需要最低5-6位,即`64-k`与`-k`相同(对于int是与`32-k`相同) (10认同)
  • 仍然不正确,你需要使用逻辑右移,`>>>`.坚持一个方法,你有'Integer.rotateRight`. (4认同)
  • @rlibby:谢谢,修好.@john:你应该使用finnw的答案中的`rotateLeft` /`rotateRight`代码.我会留下这个答案,因为它是执行此操作的一般方法,但如果有的话,使用内置函数要好得多. (4认同)

小智 8

答案schnaader是正确的:

return (bits >>> k) | (bits << (32-k));
Run Code Online (Sandbox Code Playgroud)
  1. 第一部分(bits >>> k)右移存储在值bitsk比特和"第三>"确保了最左边的位是零,而不是符号的bits
  2. 第二部分通过-complement位数(bits << (32-k))左移该值bitsk

现在,您有两个临时变量,其中第一个(32-k)位存储在var(1)的最右边位,最后k位存储在var(2)的最左边位.按位或运算简单地将这两个临时变量一起运算(注意使用>>>而不是>>)并且你有循环移位.