左移

int a = 1;      // 0001b
int b = a << 1; // 0010b

std::cout << "a = " << a << ", b = " << b << std::endl;

輸出

a = 1, b = 2

為什麼

左位移位將左手值(a)的位移位右側指定的數字(1),基本上用 0 來填充最低有效位,因此將 5(二進位制 0000 0101)的值移到左邊 4 時間(例如 5 << 4)將產生 80(二進位制 0101 0000)的值。你可能會注意到,將值向左移 1 次也與將值乘以 2 相同,例如:

int a = 7;
while (a < 200) {
    std::cout << "a = " << a << std::endl;
    a <<= 1;
}

a = 7;
while (a < 200) {
    std::cout << "a = " << a << std::endl;
    a *= 2;
}

但應該注意左移位操作會將所有位向左移位,包括符號位,例如:

int a = 2147483647; // 0111 1111 1111 1111 1111 1111 1111 1111
int b = a << 1;     // 1111 1111 1111 1111 1111 1111 1111 1110

std::cout << "a = " << a << ", b = " << b << std::endl;

可能的輸出:a = 2147483647, b = -2

雖然有些編譯器會產生看似預期的結果,但應該注意的是,如果你將 shift 符號移位以使符號位受到影響,則結果是未定義的。如果你希望移位的位數是負數或大於左側型別可以容納的位數,則也未定義,例如:

int a = 1;
int b = a << -1;  // undefined behavior
char c = a << 20; // undefined behavior

除非特別指定使用按位分配複合運算子 <<=,否則按位左移不會更改原始值的值:

int a = 5;  // 0101b
a <<= 1;    // a = a << 1;