[英]Bit circular shift
我目前正在學習按位運算,我的任務是對 4 位整數進行左旋轉。
我的 4 位左旋轉代碼是
private static int BITS_IN_INTEGER = 4;
private static int leftRotate(int x, int n) {
return (x << n) | (x >> (BITS_IN_INTEGER - n));
}
我想進行 4 位循環移位以在旋轉后保持 4 位,但似乎無法理解它是如何工作的。
示例:10 (1010) 向左旋轉 1 位后將得到 5 (0101),但它給我的值是 21,這比我的 4 位多。
任何幫助我理解這個問題的幫助將不勝感激!
如果我理解正確的話,你想
BITS_IN_INTEGER
模擬整數,而不是 32 位。目前您可以進行旋轉,但不屬於模擬 int 的實際 int 的高位可能會以 0 以外的其他形式結束。示例:
intput x
0000 0000 0000 0000 0000 0000 0000 1100
|____|___, emulated int
result of rotating left by n=2 | |
0000 0000 0000 0000 0000 0000 0011 0011
如我們所見,我們所要做的就是將模擬 int 之上的位(即 32 - BITS_IN_INTEGER
高位)設置為零。 為此,我們使用邏輯“與” ( &
)。 我們需要一個掩碼,在我們想要設置為零的位上有0
(任何東西& 0
總是 0),在我們想要保留的位上有一個1
(任何東西& 1
總是任何東西)。
0...0 0011 0011 ← the result from before
& 0...0 0000 1111 ← a mask
——————————————————
0...0 0000 0011 ← the masked result where unused bits are 0
要使用BITS_IN_INTEGER
生成0...01...1
形式的掩碼,我們可以使用(1 << BITS_IN_INTEGER) - 1
1
- 1
將10000
轉換為01111
。
static int BITS_IN_INTEGER = 4;
static int INTEGER_MASK = (1 << BITS_IN_INTEGER) - 1;
static int leftRotate(int x, int n) {
return INTEGER_MASK & ((x << n) | (x >>> (BITS_IN_INTEGER - n)));
}
這是leftRotate()和rightRotate()的javascript實現,基於上述來自Socowi的回答(謝謝!)
我需要模擬一個在左(逆時針)和右(順時針)方向都旋轉 90º 的簡單指南針(不是真正的指南針,只是一個有趣的問題)。
因此,我沒有通過存儲先前的方向並使用 * if / else * 或 * switch * 來弄亂代碼,而是想出了一個想法,即循環移位或位旋轉會更加干凈、高效和優雅課程。
但是,我在將掩碼限制為 4 位方面遇到了同樣的問題。 多虧了上述解決方案,我才能夠做到; ;)
所以假設如下:
- North = 1 = 0001 - West = 2 = 0010 - South = 4 = 0100 - East = 8 = 1000
當我需要從北轉 90º 到 -> 西時,我調用leftRotate()等等,直到我再次到達同一點(北)。
這同樣適用於反向,如果從北向東轉 90º,我調用rightRotate() ,然后再次向南轉,依此類推。
摘錄如下,希望對你有幫助:
const BITS_IN_INTEGER = 4; const INTEGER_MASK = (1 << BITS_IN_INTEGER) - 1; // this function rotates to left (counter clockwise) 1,2,4,8...1,2,4,8 function leftRotate(x, n) { return INTEGER_MASK & ((x << n) | (x >>> (BITS_IN_INTEGER - n))); } // this function rotates to right (clockwise) 1,8,4,2...1,8,4,2 function rightRotate(x, n) { return INTEGER_MASK & ((x << (BITS_IN_INTEGER - n)) | (x >>> n)); } // Lets rotate: console.log('--- Rotate to left (counter clockwise) 1,2,4,8...1,2,4,8...1:') let value = 1; for (let i = 0; i < 8; i++) { console.log(value); value = leftRotate(value, 1); } console.log('-- Rotate to right (counter clockwise) 1,8,4,2...1,8,4,2...1:') for (let i = 0; i < 8; i++) { console.log(value); value = rightRotate(value, 1); }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.