前陣子在刷 LeetCode 時,發現解題方式可以使用移位運算子,雖然筆者早就看過這個運算元,卻沒實際了解過,也趁這個機會快速了解移位運算子是個什麼樣的概念。
首先,筆者遇到的題型非常簡單,將二進位制轉換為十進位制,如將二進位 1110
轉換成十進位,得解為 14
,在 C# 中可直接使用 Convert
來實現進位之間的轉換
string binary = "1110";
// 二進位轉十進位, 第二個參數為 base
Convert.ToInt32(binary, 2);
如此是透過現成方法來實現轉換,為了更了解二進制的應用,特意觀察不少的解法,其中不少解法是透過移位運算子,撰寫起來也非常簡潔且優雅,那什麼是移位運算子?
移位運算子有兩種
- 左移運算子
<<
- 右移運算子
>>
區分方式也非常易懂,純粹是移位方向的不同,以 1110
為例,對此二進位制的所有位元進行左移一個位元,即將所有位元往左邊移動一位,而最右邊的第一個數則補上 0
,得到結果為 11100
,若左移兩個位元則為 111000
;反之右移則是向右移動,對 1110
右移一個位元得到 0111
,若右移兩個位元則得 0011
。
- 左移一個位元的表示方式為
num << 1
- 左移一個位元的表示方式為
num << 2
- 右移一個位元的表示方式為
num >> 1
- 右移一個位元的表示方式為
num >> 1
實際使用程式碼測試,先宣告一個整數變數 num
,因為該變數是以十進位表示之,此處特意註解 num
二進位的表示方式,接著透過移位運算子,向左搬移一位,最後得十進位的結果。
// 十進位 14, 二進位 1110
int num = 14;
// 向左移 1 位
num = num << 1;
// 得到十進位 28, 二進位 11100
Console.Write(num);
試試看右移一個位元
// 十進位 14, 二進位 1110
int num = 14;
// 向左移 1 位
num = num >> 1;
// 得到十進位 7, 二進位 0111
Console.Write(num);
讀者有發現一件神奇的事嗎?
如果我們向左移一個位元,其結果會是原本的兩倍,若向右位移一位,其結果會是原本的一半。
有這麼神奇的事?試試看一次移兩個位元會發生什麼事
int num = 20;
// 80
Console.WriteLine(num << 2);
// 5
Console.WriteLine(num >> 2);
每增加一個位移的位元,就會作一次乘二或除二的動作,將 num=20
向左位移兩個位元,其結果就是 20 * 2 * 2 = 80
,同理向右移兩個位元可得 20 / 2 / 2 = 5
最後,移位運算子當然也有指派的運算子,若要將 num
位移後的結果指派給 num
,可以這麼寫 num = num >> 1
,也可以使用移位指派運算子寫成 num >>= 1
,左位移則是 num <<= 1
。這麼簡單的運算子,筆者真是太晚才想好好的認識它,收工!
Reference
Left Shift and Right Shift Operators (>> and <<)
Thanks for reading the article 🌷 🌻 🌼
If you like it, please don't hesitate to click heart button ❤️
or follow my GitHub ⭐ I'd appreciate it.
Top comments (0)