C++
示例
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(binary00000101)的值左移4次(例如5<<4)将产生80(binary01010000)的值。您可能会注意到,将值向左移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; //01111111111111111111111111111111 int b = a << 1; //11111111111111111111111111111110 std::cout << "a = " << a << ", b = " << b << std::endl;
可能的输出:a=2147483647,b=-2
尽管某些编译器会产生看起来预期的结果,但应注意的是,如果左移带符号的数字以使符号位受到影响,则结果是不确定的。如果要移位的位数是负数还是大于左侧类型可以容纳的位数,则也不确定,例如:
int a = 1; int b = a << -1; //未定义的行为 char c = a << 20; //未定义的行为
逐位左移不会更改原始值的值,除非专门指定使用逐位分配复合运算符<<=:
int a = 5; //0101b a <<= 1; // a = a << 1;