我想知道如何實現由int
位表示位串K A 圓形右移循環移位。爪哇 - 使用按位運算
public int rtCircShift(int bits, int k)
{
return bits >> k;
}
所有這些代碼所做的就是返回0,我怎樣才能使一個循環移位?
我想知道如何實現由int
位表示位串K A 圓形右移循環移位。爪哇 - 使用按位運算
public int rtCircShift(int bits, int k)
{
return bits >> k;
}
所有這些代碼所做的就是返回0,我怎樣才能使一個循環移位?
你的意思是你想讓右邊的位旋轉出現在左邊?
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
The answer通過schnaader是正確的:
return (bits >>> k) | (bits << (32-k));
(bits >>> k)
右移由k
比特存儲在bits
的值和「第三>
」確保最左邊的位是零,而不是的bits
(bits << (32-k))
通過bits
左移位的值的符號k
比特-complement數現在,有兩種臨時變量,其中第一(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'。
將邏輯'或'變成按位。 – Femaref 2011-04-30 19:26:01
就是這樣,謝謝。 – john 2011-04-30 19:30:31
仍然不正確,你需要使用邏輯右移,'>>>'。堅持這個方法,你有'Integer.rotateRight'。 – rlibby 2011-04-30 19:33:17