2.5.6 位运算符和位运算表达式
位运算符用于对二进制数值的位进行运算,共有6个运算符,如表2-13所示。
表2-13 位运算符
|
符 号
|
用 法
|
含 义
|
|
~
|
~a
|
按位求反
|
|
<<
|
a<<2
|
左移
|
|
>>
|
a>>2
|
右移
|
|
&
|
a&b
|
按位与
|
|
^
|
a^b
|
按位异或
|
|
|
|
a^b
|
按位或
|
说明:
(1) 参与位操作的操作符必须是整型数据或字符型数据。虽然它们可以是signed或unsigned,但建议使用unsigned类型。因为符号位在不同的位运算符中的处理方法不一样,同时又受到机器型号的影响程序在不同条件下的执行结果也不同。所以使用unsigned类型有助于提高程序的正确性。
(2) 位运算符的优先级:~最高,>>、<<次之,&、|、^最低。
(3) 位运算符的结合方向:除了~运算符是由右至左外,其他运算符都是由左至右。
1. 按位求反
求反运算符~为单目运算符,具有右结合性,其功能是对参与运算的数的各二进制位按位求反,即将原来为1的位变为0,原来为0的位变为1。例如,~9的运算为:~(0000000000001001)结果为:1111111111110110
2. 按位与
运算符&将其两个操作数对应位逐一地进行逻辑与运算。两个一位二进制数逻辑与运算的规则为"见零即零",即两个数中只要有一个为0,则其逻辑与的结果就为0。参与运算的数以补码方式出现。
例如:有两个八进制数a=255、b=233,将这两个字符型数据进行按位与运算。
因为a=010101101 b=011001011
所以a&b=010001001
按位与运算通常用来对某些位清0,另一些位保持不变。例如,把a的高八位清0,保留低八位,可作a&255运算(255的二进制数为0000000011111111)。
3. 按位或
运算符|将其两个操作数对应位逐一地进行逻辑或运算。两个一位二进制数逻辑或运算的规则为"见壹则壹",即两个数中只要有一个为1,则其逻辑或的结果就为1。参与运算的两个数均以补码出现。
例如:有两个十六进制数a=10,b=34,则a|b的运算结果为:00110100
因为a=00010000 b=00110100
所以a|b=00110100
按位或运算通常用来对某些位置1,另一些位保持不变。例如,把a的低八位置1,保留高八位,可作a|255运算(255的二进制数为0000000011111111)。
4. 按位异或
运算符^将其两个操作数对应位逐一地进行逻辑异或运算。两个一位二进制数逻辑异或的规则为"同则零,异则壹"。即两个数只要不同,则其逻辑异或的结果就为1;否则为0。参与运算数仍以补码出现。
例如:有两个十六进制数a=10、b=35,则a^b的运算结果为:00100101
因为a=00010000 b=00110101
所以a^b=00100101
5. 左移
左移运算符<<是双目运算符,其功能把左边的运算数的各二进制位全部左移若干位,由右边的数指定移动的位数,高位丢弃,低位补0。由于移位运算符的右操作数表示的是欲移动的位数,所以,其必须是一个整型表达式。
例如:有一个十六进制数a=85。
- a=10000101
- a<<22=00010100
在对整数操作中,左移1位相当于乘2,左移2位相当于乘4,一般来说,将一个数左移n位,就相当于将该数乘以2n。所以在程序中,常用左移位来进行快速的乘法运算。但有一点注意:以上结论只是在左移不出现溢出时才是正确的。
6. 右移
右移运算符>>是双目运算符,其功能是把左边的运算数的各二进制位全部右移若干位,右边的数指定移动的位数。
(1) 对无符号的int或char型数据来说,右移时左端补0。如下所示:
- a=1000101
- a>>2=00100001
(2) 对带符号的int和char型数据,空出的位补符号位。
与左移操作相对应,将一个数右移n位,相当于将该数除以2n,其小数部分将被忽略。