DEV Community

Cover image for C# - Left Shift and Right Shift Operators (>> and <<)
FakeStandard
FakeStandard

Posted on • Edited on

C# - Left Shift and Right Shift Operators (>> and <<)

前陣子在刷 LeetCode 時,發現解題方式可以使用移位運算子,雖然筆者早就看過這個運算元,卻沒實際了解過,也趁這個機會快速了解移位運算子是個什麼樣的概念。

首先,筆者遇到的題型非常簡單,將二進位制轉換為十進位制,如將二進位 1110 轉換成十進位,得解為 14,在 C# 中可直接使用 Convert 來實現進位之間的轉換

string binary = "1110";

// 二進位轉十進位, 第二個參數為 base
Convert.ToInt32(binary, 2);
Enter fullscreen mode Exit fullscreen mode

如此是透過現成方法來實現轉換,為了更了解二進制的應用,特意觀察不少的解法,其中不少解法是透過移位運算子,撰寫起來也非常簡潔且優雅,那什麼是移位運算子?

移位運算子有兩種

  • 左移運算子 <<
  • 右移運算子 >>

區分方式也非常易懂,純粹是移位方向的不同,以 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);
Enter fullscreen mode Exit fullscreen mode

試試看右移一個位元

// 十進位 14, 二進位 1110
int num = 14;

// 向左移 1 位
num = num >> 1;

// 得到十進位 7, 二進位 0111
Console.Write(num);
Enter fullscreen mode Exit fullscreen mode

讀者有發現一件神奇的事嗎?

如果我們向左移一個位元,其結果會是原本的兩倍,若向右位移一位,其結果會是原本的一半。

有這麼神奇的事?試試看一次移兩個位元會發生什麼事

int num = 20;

// 80
Console.WriteLine(num << 2);

// 5
Console.WriteLine(num >> 2);
Enter fullscreen mode Exit fullscreen mode

每增加一個位移的位元,就會作一次乘二或除二的動作,將 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)