设为首页 加入收藏

TOP

4.8 位运算符(1)
2013-10-07 16:29:07 来源: 作者: 【 】 浏览:113
Tags:4.8位 运算

4.8  位运算符(1)

位运算符作用于整数类型的运算对象,并把运算对象看成是二进制位的集合。位运算符提供检查和设置二进制位的功能,如17.2节(第723页)将要介绍的,一种名为bitset的标准库类型也可以表示任意大小的二进制位集合,所以位运算符同样能用于bitset类型。

4.3:位运算符(左结合律)

运算符

功能

用法

~

位求反

~ expr

<< 

左移

expr1 << expr2

>> 

右移

expr1 >> expr2

&

位与

expr & expr

^

位异或

expr ^ expr

|

位或

expr | expr

一般来说,如果运算对象是"小整型",则它的值会被自动提升(参见4.11.1节,第160页)成较大的整数类型。运算对象可以是带符号的,也可以是无符号的。如果运算对象是带符号的且它的值为负,那么位运算符如何处理运算对象的"符号位"依赖于机器。而且,此时的左移操作可能会改变符号位的值,因此是一种未定义的行为。

关于符号位如何处理没有明确的规定,所以强烈建议仅将位运算符用于处理无符号类型。

移位运算符

之前在处理输入和输出操作时,我们已经使用过标准IO库定义的<<运算符和>>运算符的重载版本。这两种运算符的内置含义是对其运算对象执行基于二进制位的移动操作,首先令左侧运算对象的内容按照右侧运算对象的要求移动指定位数,然后将经过移动的(可能还进行了提升)左侧运算对象的拷贝作为求值结果。其中,右侧的运算对象一定不能为负,而且值必须严格小于结果的位数,否则就会产生未定义的行为。二进制位或者向左移(<<)或者向右移(>>),移出边界之外的位就被舍弃掉了:

左移运算符(<<)在右侧插入值为0的二进制位。右移运算符(>>)的行为则依赖于其左侧运算对象的类型:如果该运算对象是无符号类型,在左侧插入值为0的二进制位;如果该运算对象是带符号类型,在左侧插入符号位的副本或值为0的二进制位,如何选择要视具体环境而定。

位求反运算符

位求反运算符( )将运算对象逐位求反后生成一个新值,将1置为0、将0置为1:

 

char类型的运算对象首先提升成int类型,提升时运算对象原来的位保持不变,往高位(high order position)添加0即可。因此在本例中,首先将bits提升成int类型,增加24个高位0,随后将提升后的值逐位求反。

位与、位或、位异或运算符

与(&)、或(|)、异或(^)运算符在两个运算对象上逐位执行相应的逻辑操作:

 

对于位与运算符(&)来说,如果两个运算对象的对应位置都是1则运算结果中该位为1,否则为0。对于位或运算符(|)来说,如果两个运算对象的对应位置至少有一个为1则运算结果中该位为1,否则为0。对于位异或运算符(^)来说,如果两个运算对象的对应位置有且只有一个为1则运算结果中该位为1,否则为0。

有一种常见的错误是把位运算符和逻辑运算符(参见4.3节,第141页)搞混了,比如位与(&)和逻辑与(&&)、位或(|)和逻辑或(||)、位求反(~)和逻辑非(!)。

使用位运算符

我们举一个使用位运算符的例子:假设班级中有30个学生,老师每周都会对学生进行一次小测验,测验的结果只有通过和不通过两种。为了更好地追踪测验的结果,我们用一个二进制位代表某个学生在一次测验中是否通过,显然全班的测验结果可以用一个无符号整数来表示:
 

  1. unsigned long quiz1 = 0;    // 我们把这个值当成是位的集合来使用  

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇4.7 条件运算符 下一篇4.8 位运算符(2)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: