移位运算符

140 阅读3分钟

移位运算符向左或向右移动位。同样,我们在示例中仍然使用二进制数,有助于读者理解其工作原理。 1.左移:<< 左移运算符(<<)将其左侧运算对象每一位的值向左移动其右侧运算对象指定的位数。左侧运算对象移出左末端位的值丢失,用0填充空出的位置。下面的例子中,每一位都向左移动两个位置: (10001010) << 2  // 表达式 (00101000)    // 结果值 该操作产生了一个新的位值,但是不改变其运算对象。例如,假设stonk为1,那么 stonk<<2为4,但是stonk本身不变,仍为1。可以使用左移赋值运算符(<<=)来更改变量的值。该运算符将变量中的位向左移动其右侧运算对象给定值的位数。如下例: int stonk = 1; int onkoo; onkoo = stonk << 2;  /* 把4赋给onkoo / stonk <<= 2;     / 把stonk的值改为4 */ 2.右移:>> 右移运算符(>>)将其左侧运算对象每一位的值向右移动其右侧运算对象指定的位数。左侧运算对象移出右末端位的值丢。对于无符号类型,用 0 填充空出的位置;对于有符号类型,其结果取决于机器。空出的位置可用0填充,或者用符号位(即,最左端的位)的副本填充: (10001010) >> 2    // 表达式,有符号值 (00100010)       // 在某些系统中的结果值 (10001010) >> 2    // 表达式,有符号值 (11100010)       // 在另一些系统上的结果值 下面是无符号值的例子: (10001010) >> 2    // 表达式,无符号值 (00100010)       // 所有系统都得到该结果值 每个位向右移动两个位置,空出的位用0填充。 右移赋值运算符(>>=)将其左侧的变量向右移动指定数量的位数。如下所示: int sweet = 16;int ooosw; ooosw = sweet >> 3;  // ooosw = 2,sweet的值仍然为16 sweet >>=3;      // sweet的值为2 3.用法:移位运算符 移位运算符针对2的幂提供快速有效的乘法和除法: number << n    number乘以2的n次幂 number >> n    如果number为非负,则用number除以2的n次幂 这些移位运算符类似于在十进制中移动小数点来乘以或除以10。 移位运算符还可用于从较大单元中提取一些位。例如,假设用一个unsigned long类型的值表示颜色值,低阶位字节储存红色的强度,下一个字节储存绿色的强度,第 3 个字节储存蓝色的强度。随后你希望把每种颜色的强度分别储存在3个不同的unsigned char类型的变量中。那么,可以使用下面的语句: #define BYTE_MASK 0xff unsigned long color = 0x002a162f; unsigned char blue, green, red; red = color & BYTE_MASK; green = (color >> 8) & BYTE_MASK; blue = (color >> 16) & BYTE_MASK; 以上代码中,使用右移运算符将 8 位颜色值移动至低阶字节,然后使用掩码技术把低阶字节赋给指定的变量。