位运算是指按二进制进行的运算。
在系统软件中,常常需要处理二进制位的问题。C语言提供了6个位操作运算符。这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型。
1、位运算符
运算符 | 含义 | 描述 |
& | 按位与 | 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0 |
| | 按位或 | 两个相应的二进制位中只要有一个为1,该位的结果值为1 |
^ | 按位异或 | 若参加运算的两个二进制位值相同则为0,否则为1 |
~ | 取反 | ~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0 |
<< | 左移 | 用来将一个数的各二进制位全部左移N位,右补0 |
>> | 右移 | 将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0 |
说明:
- 除了按位取反运算符~,其它均为双目运算符。
- 参加位运算的对象只能是整形或字符型数据,不能为实型数据 。
- 注意运算符的结合性和优先级问题。
2、位运算
(1)&(按位“与”)
运算规则为:
0&0=0, 0&1=0, 1&0=0, 1&1=1(即只有当两者都为真时才为真)
例如:-5&9的值为9,运算过程如下:
-5 = | 1111 1011 |
(&)9 = | 0000 1001 |
0000 1001 |
例如,-5&3的值为3,此时要把-5写成补码的形式,其补码为11111011,运算过程如下:
-5 = | 1111 1011 |
(&)3 = | 0000 0011 |
0000 0011 |
(2)|(按位“或”)
运算规则为:
0|0=0, 0|1=1, 1|0=1, 1|1=1(即只要有一个为真时才为真)
例如:5|9的值为13,运算过程如下:
5 = | 0000 0101 |
(|)9 = | 0000 1001 |
0000 1101 |
(3)^(按位“异或”)
运算规则为:
0^0=0, 0^1=1, 1^0=1, 1^1=0(即当两者取值相异时为真)
例如:-5|3的值为-8,运算过程如下:
-5 = | 1111 1011 |
(^)3 = | 0000 0001 |
1111 1000 |
(4)~(按位“取反”)
运算规则为:
~0=1, ~1=0(取相反的值)
例如:~7的值为-8,运算过程如下:
(~)7 = | 0000 0111 |
1111 1000 |
(5)<<(“左移”)
用佬将一个数的各二进制位全部左移若干位,右边空缺位补0.
例如:将3左移2位,结果为12。如图:
左移2位 | |
00000011----->00001100 |
左移1位相当于该数乘以2,左移n位相当于该数乘以2的n。因此,将3左移2位,相当于3乘以4。
(6)>>(“右移”)
用来将一个数的各二进制全部右移若干位。移去右端的位将被舍弃,若为无符号数,左端补0。例如,将15右移3位,结果为1。如图:
右移3位 | |
00001111----->00000001 |
右移1位相当于该数除以2,右移n位相当于该数除以2的n次方,因此,将15右移3位,相当于15/2的3次方=1(C语言规定整数相除商为整数)。