簡體   English   中英

位循環移位

[英]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 - 110000轉換為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()實現,基於上述來自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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM