1按位与(&)
按位与操作的作用是将两个操作数对应的每一位分别进行逻辑与操作。例如计算3&5,计算过程如图(a)
使用按位与操作可以将操作数中的若干位置0(其它位不变),或者取操作数中的若干指定位。请看下面的两个例子:
i下列语句将char型变量a的最低位置0
a = a & 0376 (注:这里的0376是八进制哈, 0376化为二进制:000 011 111 110则其二进制的低八位为:1111 1110 ,而char型只有一个字节长度,即8位,所以与0376与运算之后就是将其最低位置0)
ii假设有c是char型变量,a是int变量,下列语句可取出a的低字节,置于c中:
c = a & 0377(注:这里的0377同样是八位,它是将a中的低八位全部取出赋值给c)
2按位或(|)
按位或操作的作用是将两个操作数对应的每一位分别进行逻辑或操作。例如,计算3|5,计算过程如图(b).
使用按位或操作可以将操作数中的若干位置1(其它位不变)。例如,将int型变量a的低字节置1:
a = a|0xff
3按位异或(^)
按位异或操作的作用是将两个操作数对应的每一位进行异或,若对应位相同,则该位的运算结果为0,若对应位不相同,则运算结果为1.例如,计算071^025,计算过程如图(c).
使用按位异或操作可以将操作数中的若干指定位翻转。如果使某位与0异或,结果是该位的原值;如果使某位与1异或,则结果与该位原来的值相反。例如,要使01111010低四位翻转,可以与00001111进行异或,计算过程如图(d),注意这里的翻转是咋个翻转的!
4按位取反(~)
按位取反是一个单目运算符,其作用是对一个二进制数的每一位取反。例如图e。
5移位
C++中有两个移位运算符:左移运算(<<)和右移运算(>>),都是二元运算符。移位运算符左边的操作数是需要移位的数值,右边的操作数是左移或右移的位数。左移是按照指定的位数将一个数的二进制值向左移位。左移后,低位补0,移出的高位舍弃。右移是按照指定的位数将一个数的二进制值向右移位。右移后,移出的低位舍弃。如果是无符号数则高位补0,如果是有符号数,则高位补符号位或补0。例如:
i如果有char型变量a的值为-8,则a在内存中的二进制补码值为 1111 1100,于是表达式a >> 2的值为 -2。具体移位过程如图1。
ii表达式2 << 1的值为4.具体移位过程如图2。
[注意]移位运算的结果是位运算表达式(a>>2和2<<1)的值,移位运算符左边的表达式(变量a和常量2)的值本身并不会被改变,但是,如果变量在表达式中参与了自增或自减的修改后,变量的值也就跟着被改变!
int a = -8
cout<<”a>>2 = ”<<(a>>2)<<” , a = ”<<a<<endl;//输出为:a>>2 = -2 , a= -8 (a没有参与修改自身值的运算,所以运算之后a的值没有改变)
cout<<”++a>>2:”<<(++a>>2)<<”a:”<<a<<endl;//输出为:++a>>2 =-2 , a = -7(a在移位运算表达式中参与修改自身值的运算,所以移位之后,a的值也改变了)