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)); 
  1. 第一部分(bits >>> k)将存储bits的值右移k位,'第三> '确保最左边的位为零,而不是bits的符号
  2. 第二部分(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”。