2011-04-30 105 views
22

我想知道如何实现由int位表示位串K A 圆形右移循环移位。爪哇 - 使用按位运算

public int rtCircShift(int bits, int k) 
{ 
    return bits >> k; 
} 

所有这些代码所做的就是返回0,我怎样才能使一个循环移位?

回答

26

这应该工作:

return (bits >>> k) | (bits << (Integer.SIZE - k)); 

另见Wikipedia article on circular shifts

+0

将逻辑'或'变成按位。 – Femaref 2011-04-30 19:26:01

+0

就是这样,谢谢。 – john 2011-04-30 19:30:31

+4

仍然不正确,你需要使用逻辑右移,'>>>'。坚持这个方法,你有'Integer.rotateRight'。 – rlibby 2011-04-30 19:33:17

29

你的意思是你想让右边的位旋转出现在左边?

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 
7

The answer通过schnaader是正确的:

return (bits >>> k) | (bits << (32-k)); 
  1. 的F开始步骤部分(bits >>> k)右移由k比特存储在bits的值和“第三>”确保最左边的位是零,而不是的bits
  2. 第二部分(bits << (32-k))通过bits左移位的值的符号k比特-complement数

现在,有两种临时变量,其中第一(32-k)个比特被存储在VAR(1)的最右位,而最后k个比特被存储在最左var(2)的位。按位或操作将这两个温度变量简单地对齐在一起(注意使用>>>而不是>>),并且您有循环移位。

0
int x=12345,n=5; 
System.out.println((x%10)*Math.pow(10, n-1)+(x/10)); 

要移动一位。

0

这应做到:

/** 
* 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'。