2011-04-30 88 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'。