当前位置:嗨网首页>书籍在线阅读

16-移位运算符

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

15.3.7 移位运算符

下面介绍C的移位运算符。移位运算符向左或向右移动位。同样,我们在示例中仍然使用二进制数,有助于读者理解其工作原理。

1.左移: <<

左移运算符( << )将其左侧运算对象每一位的值向左移动其右侧运算对象指定的位数。左侧运算对象移出左末端位的值丢失,用 0 填充空出的位置。下面的例子中,每一位都向左移动两个位置:

(10001010) << 2   // 表达式
(00101000)        // 结果值

该操作产生了一个新的位值,但是不改变其运算对象。例如,假设 stonk1 ,那么 stonk<<24 ,但是 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位颜色值移动至低阶字节,然后使用掩码技术把低阶字节赋给指定的变量。