左移
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;