位元左移運算 (<<), 位元右移運算 (>>)

描述

C++ 有兩個算術移位的運算子:左移位 << 與右移位 >>;該運算子的運算方式為向左或向右移動運算子左邊的運算元所有位元,移動的位數由運算子右邊的運算元決定。

更多的位元運算數學請參考 這裡

語法


variable << number_of_bits variable >> number_of_bits

參數

variable: 任一變數 (byte, int, long)
number_of_bits: 一個小於 32 的整數

範例

    int a = 5;        // binary: 00000000000000000000000000000101
    int b = a << 3;   // binary: 00000000000000000000000000101000, 等於十進制的 40
    int c = b >> 3;   // binary: 00000000000000000000000000000101, 回到一開始的 5

當你對一個數值 x 左移位 y 個位元時 (x << y),x 中最左邊的 y 個位元將會逐一移出表示範圍之外而消失。

    int a = 5;        // binary: 00000000000000000000000000000101
    int b = a << 30;  // binary: 01000000000000000000000000000000 - 101 中最前面的 1 就這麼消失了

如果你確定在移位後不會有位元 1 因溢位而消失,可以簡單的將左移運算子視為乘以 2 的次方數,運算子右邊的整數則視為次方數,2 的各個次方數如下所示:

        1 << 0 == 1         1 << 1 == 2         1 << 2 == 4         1 << 3 == 8         ...         1 << 8 == 256         1 << 9 == 512         1 << 10 == 1024         ...

當 x 右移位 y 個位元時 (x >> y),而且 x 的最高位元是 1,則運算行為會根據 x 的資料型別不同而有所改變;若 x 是 int 型別,最高位元為符號位元,基於某些典故,在此符號位元將會逐位複製到右移位後空出來的位元:

    int x = -16;     // binary: 11111111111111111111111111110000
    int y = x >> 3;  // binary: 11111111111111111111111111111110

這個行為稱為符號延伸 (sign extension),這可能不會是你想要的結果,你可能會想要的是 0 從左端開始移位,所以在這種狀況下你可以透過型別轉換至 unsigned int 來解決這個問題:

    int x = -16;                   // binary: 11111111111111111111111111110000
    int y = (unsigned int)x >> 3;  // binary: 00011111111111111111111111111110

如果你能小心地避免掉記符號延伸的問題,那麼你可以用右移位運算子 >> 去進行一個除以 2 的次方數的運算:

    int x = 1000;
    int y = x >> 3;   // 等同於 1000 / 8, y 得到 125.

語法參考主頁面

本頁由熱血青年 LBU 譯自英文版。

The text of the 86Duino reference is a modification of the Arduino reference, and is licensed under a Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain.