c++按位操作符
顾名思义,按位运算符允许按照位来操作整型变量。可以把按位运算符应用于任意signed和unsigned整型,包括char类型。但是,它们通常应用于不带符号的整型。
这些运算符的一个常见应用是在整型变量中使用单个的位存储信息。例如标记,它用于描述二进制状态指示符。可以使用一个位来描述有两个状态的值:开或关、男或女,真或假。
也可以使用按位运算符处理存储在一个变量中的几个信息项。例如,颜值常常记录为三个八位值,分别存储颜中红、绿和蓝的强度。这些常常保存到四字节变量中的三个字节。第四个字节也不会浪费,包含表示颜透明度的值。显然,要处理各个颜成分,需要从变量中分离出各个字节,按位运算符就可以做到这一点。
再看另外一个例子,假定需要记录字体的信息,那么,只要存储每种字体的样式和字号,以及字体是黑体还是斜体,就可以把这些信息都存储在一个二字节的整型变量中,如图3-1所示。
图3-1 把字体数据存储在2个字节中
可以使用一位来记录字体是否为斜体—— 1表示斜体,0表示一般。同样,用另一位来指定字体是否为黑体。使用一个字节可以从多达256种不同的样式中选择一个,再用另外5位记录最多32磅的字号。因此,在一个16位的字中,可以记录四个不同的数据项。按位运算符提供了访问和修改整数中单个位和一组位的便利方式,能方便地组合和分解一个16位的字。
3.3.1 移位运算符
移位运算符可以把整型变量中的内容向左或向右移动指定的位数。移位运算符和其他按位
运算符一起使用,可以获得前面描述的结果。>>运算符把位向右移动,<<运算符把位向左移动,移出变量两端的位被舍弃。
所有的按位操作都可以处理任何类型的整数,但本章的例子使用16位的变量,使例子较为简单。用下面的语句声明并初始化一个变量number:
unsigned short number=16387U;
如第2章所述,不带符号的字面量应在数字的最后添加字母U或u。
在下面的语句中,对这个变量的内容进行移位,并存储结果:
unsigned short result = number <<2; //Shift left two bit positions
移位运算符的左操作数是要移位的值,右操作数指定要移动的位数。图3-2列出了该操作的过程。
图3-2 移位运算
从图3-2可以看出,把数值16387向左移动两位,得到数值12。数值的这种剧烈变化是舍弃高位数字的结果。
把数值向右移动,可以使用下面的语句:
result = number >>2; //Shift right two bit positions
运算符优先级按从高到低排列把数值16387向右移动两位,得到数值4096。向右移动两位相当于使该数值除以4。
只要没有舍弃位,向左移动n位就相当于把该数值乘以2的n次方。换言之,就等于把该数值乘以2n。同样,向右移动n位就相当于把该数值除以2的n次方。但要注意,变量number向左移位时,如果舍弃了重要的位,结果就不是我们希望的那样了。可是,这与乘法运算并没有不同。如果把2字节的数值乘以4,就会得到相同的结果,所以向左移位和相乘仍是等价的。出现问题的原因是相乘的结果超出了2字节整数的取值范围。
如果需要修改原来的值,可以使用op= 赋值运算符。在这种情况下,可以使用>>=或<<=运算符。例如:
number >>= 2; // Shift contents of number two positions to the right
这等价于:
number =number >> 2; // Shift contents of number two positions to the right
这些移位运算符跟前面用于输入输出的插入和提取运算符有可能搞混。从编译器的角度来看,其含义一般可以从上下文中判断出来。否则,编译器就会生成一个消息,但用户需要非常小心。例如,如果输出变量number向左移动两位的结果,就应编写下面的代码:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论