位运算符一共有如下七个。
整数在计算机中用二进制的位来表示,C语言提供一些运算符可以直接操作整数中的位,称为位运算,这些运算符的操作数都必须是整型的。
——下面带大家分别来看看它们各自的含义与用法——
按位于运算符——&
按位与运算符“&”是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位都为1时,结果位才为1。参与运算的两个数均以补码出现。
其所遵循的规则是:
0&0=0 0&1=0
1&0=0 1&1=1
例:
#include<stdio.h>
int main(void){
int i=3;
int j=5;
k=i&j;
printf("%d/n",k);
return 0;
}
其中现将i,j化为二进制:i=0011,j=0101。
运算过程:将二进制相同位置的数对齐,再分别进行按位与运算,如下。
0 0 1 1
& & & &
0 1 0 1
|| || || ||
0 0 0 1
计算结果可得k=1
按位或运算符——|
按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。当参与运算的是负数时,参与两个数均以补码出现。
其所遵循的规则是:
0&0=0 0&1=1
1&0=1 1&1=1
例:
#include<stdio.h>
int main(void){
int i=3;
int j=5;
k=i|j;
printf("%d/n",k);
return 0;
}
其中现将i,j化为二进制:i=0011,j=0101。
运算过程:将二进制相同位置的数对齐,再分别进行按位与运算,如下。
0 0 1 1
| | | |
0 1 0 1
|| || || ||
0 1 1 1
计算结果可得k=7
按位取反运算符——~
~i就是把i变量所有的二进制位取反。
例:
#include<stdio.h>
int main(void){
int i=3;
k=~i;
printf("%d/n",k);
return 0;
}
其中现将i,j化为二进制:i=0011。
则~i=1100。
计算结果可得k=7
按位异或运算符——^
按位异或运算符“^”是双目运算符。其功能是参与运算的两数各对应的二进位相异或。相同为0,不同为1。
其所遵循的规则是:
0&0=0 0&1=1
1&0=1 1&1=0
例:
#include<stdio.h>
int main(void){
int i=3;
int j=5;
k=i^j;
printf("%d/n",k);
return 0;
}
其中现将i,j化为二进制:i=0011,j=0101。
运算过程:将二进制相同位置的数对齐,再分别进行按位与运算,如下。
0 0 1 1
^ ^ ^ ^
0 1 0 1
|| || || ||
0 1 1 0
计算结果可得k=6
按位左移运算符——<<
左移运算符是一个计算机用语。用来将一个数的各二进制位全部左移若干位,移动的位数由右操作数指定,右操作数必须是非负值,其右边空出的位用0填补,高位左移溢出则舍弃该高位。
其所遵循的规则是:
i<<1 表示把i的所有二进制位左移一位,其右边空出的位用0填补。(左移n位相当于乘以2的n次方)
按位右移运算符——>>
右移运算是将一个二进制位的操作数按指定移动的位数向右移动,移出位被丢弃,左边移出的空位或者一律补0,或者补符号位,这由不同的机器而定。在使用补码作为机器数的机器中,正数的符号位为0,负数的符号位为1。(均由机器来定:这个不正确)(MSDN原文明确说明,右移对于无符号类型强制补0,对于有符号类型续补符号位)。
其所遵循的规则是:
i>>3 表示把i的所有二进制位右yi移3位,左边一般是0,当然也可能是1(数据不丢失的前提下,右移
n位相当于除以2的n次方)
应用举例
判断int型变量a是奇数还是偶数 a&1 = 0 偶数 a&1 = 1 奇数
取int型变量a的第k位 (k=0,1,2……sizeof(int)),即a>>k&1
将int型变量a的第k位清0,即a=a&~(1<<k)
将int型变量a的第k位置1, 即a=a|(1<<k)
int型变量循环左移k次,即a=a<<k|a>>16-k (设sizeof(int)=16)
int型变量a循环右移k次,即a=a>>k|a<<16-k (设sizeof(int)=16)
优点
C 语言位运算符在某些编程中如果灵活应用,则可以大大提高程序的执行效率,使程序执行时速度更高。[1]
而C 语言主要应用于嵌入式开发、智能电器、通信行业等一些对效率和时间都要求很高的应用领域中,学好位运算符,在程序开发中灵活应用位运算符,往往能在这些应用中起到事半功倍的效果。
位运算符使用的注意事项:[2]
(1) 位运算是对字节或字中的实际二进制位进行检测、设置或移位,它只适用于字符型和整数型变量以及它们的变体,对其它数据类型不适用。
(2)关系运算和逻辑运算表达式的结果只能是1 或0,而位运算的结果可以取0 或1 以外的值。
(3)要注意区别位运算符和逻辑运算符的不同。
部分内容摘自百度百科及《郝斌C语言自学教程》
参考资料
[1] 吴红梅.C语言位运算符及其应用[J].科技信息(科学教研),2007(34):108-109.
[2] 谭浩强.《C 程序设计( 第二版) 》.清华大学出版社.1999.12