左移、右移

来自Labplus盛思维基百科
跳转至: 导航搜索
  • 描述

出自Playground的 The Bitmath Tutorial 在C++语言中有两个移位运算符:左移位运算符(«)和右移运算符(»)。这些操作符可使左运算元中的某些位移动右运算元中指定的位数。

  • 语法

variable « number_of_bits variable » number_of_bits

  • 参数

variable - (byte, int, long) number_of_bits integer ⇐ 32

  • 例子
int a = 5; // 二进制数: 0000000000000101
int b = a << 3; // 二进制数: 0000000000101000, 或十进制数:40
int c = b >> 3; // 二进制数: 0000000000000101, 或者说回到开始时的5
//当你将x 左移y 位时(x«y),x 中最左边的y 位会逐个逐个的丢失:
int a = 5; // 二进制: 0000000000000101
int b = a << 14; // 二进制: 0100000000000000 - 101 中最左边的1 被丢弃

如果你确定位移不会引起数据溢出,你可以简单的把左移运算当做对左运算元进行2的右运算元次方的操作。例如,要产生2 的次方,可使用下面的方式:

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

当你将x 右移y 位(x»y),如果x 最高位是1,位移结果将取决于x 的数据类型。如果x是int 类型,最高位为符号位,确定是否x 是负数或不是,正如我们上面的讨论。如果x 类型为int,则最高位是符号位,正如我们以前讨论过,符号位表示x 是正还是负。在这种情况下,由于深奥的历史原因,符号位被复制到较低位:

X = -16; //二进制:1111111111110000
int y = (unsigned int)x >> 3; // 二进制: 0001111111111110
如果你能小心的避免符号扩展问题,你可以将右移操作当做对数据除2 运算。例如:
INT = 1000;
Y = X >> 3; 8 1000 //1000 整除8,使y=125