3.7 位运算符
C语言提供了位运算的功能,这使得C语言也能像汇编语言一样用来编写系统程序,兼有汇编语言的功能并取代汇编语言成为更加通俗易懂的计算机语言。位运算是对操作对象中的比特位(bit)进行移位、重置以及逻辑判断等操作。位运算只能用于字符型(char)或整型(int, short, long等),不能用于float、double、void或其他复杂类型。
C语言提供了6种位运算符,分别为位与(&)、位或(|)、位反(~)、位异或(^)、左移(<<)、右移(>>)等。其中按位取反(~)运算符优先级最高,其次是左移(<<)和右移(>>)运算符,另外3种运算符优先级最低。除了按位取反(~)运算符为一元运算符外,其他5种运算符均为二元运算符。各运算符的含义如表3-5所示。
位运算符在进行运算时需将操作对象的值先转为二进制,然后再进行运算,这里需要注意区分按位与(&)和按位或(|),以及逻辑与(&&)和逻辑或(||)的不同。
表3-5 位运算符
1. 按位与(&)
按位与(&)的一般形式为:
操作对象1 & 操作对象2
按位与(&)操作的规则为:每个操作对象对应位都为1时,结果才为1,否则为0。例如3&5的计算方法为:先转化为二进制值,然后按位进行与操作。
00000011 & 00000101 ------------ 结果为1 00000001
实际应用中,按位与(&)主要用于将某个操作对象的某些位置零。例如,将int型变量a的第3、5、7、12位置零,方法为将a和二进制数1110111101011111作位与运算,表达式为a&0xEF5F。此外,按位与(&)还可用于将操作对象的某些位保留。
范例3.12 LogicBitAnd.c
LogicBitAnd.c使用位与操作取变量a的后10位,其余位置零,并使用十六进制打印结果。方法为使变量a与另一常量作与运算,使该常量的后10位为1,其余位为0。(光盘\chat3\ LogicBitAnd.c)
01 #include<stdio.h> 02 main() 03 { 04 short a=0x9876; //定义a并赋初值0x9876 05 short res=0; //定义res并赋初值0 06 res=a&0x03ff; //取a的后10位 07 printf("结果是:\nres=%x\n", res); 08 }
程序第6行通过按位与操作获取变量a的后10位,运算方法为使a和后10位为1的常量相与,则可以正确获取a的后10位值,运算过程如下。
0x9876 1001100001110110 & a 0000001111111111 ---------------------------------------------- 0x0076 0000000001110110
程序运行结果为:
结果是:
res = 76
2. 按位或(|)
按位或(|)的一般形式为:
操作对象1 | 操作对象2
按位或(|)操作的规则为:有一个操作对象对应位为1时,结果即为1,当两个操作对象对应位都为0时,结果才为0。例如,3|5的计算方法为:先转化为二进制值,然后按位进行或操作。
00000011 | 00000101 ------------- 结果为7 00000111
按位或(|)主要用于将操作对象某些位置1。
3. 按位异或(^)
按位异或(^)的一般形式为:
操作对象1 ^ 操作对象2
按位异或(^)的操作规则为:操作对象对应位相同时为1,不同时为0。例如,3^5的计算方法为:先转化为二进制值,然后按位进行异或操作。
00000011 ^ 00000101 ------------- 结果为0xF9,十进制数249 11111001
按位异或(^)主要用于将操作对象的的某些位翻转(原来为1的位变为0,为0的变为1),其余各位不变。