在计算机的世界中,一切数据皆为二进制.而二进制则是以位为单位,因此可以说位运算即使二进制的运算.
位运算的运算分量只能是整型或字符型数据.位运算把运算对象看作是由二进位组成的位串信息,按位完成指定的运算,得到位串信息的结果.
位运算的符号
- 按位与:
&
- 按位或:
|
- 按位异或:
^
- 按位取反:
~
- 左移:
<<
- 右移:
>>
将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0
位运算符的优先级从高到低: 依次为:
~
,&
,^
,|
.
其中,按位取反运算符是单目(一元)运算符,其余均为双目运算符.而且~
的结合方向自右至左,且优先级高于算术运算符,其余运算符的结合方向都是自左至右,且优先级低于关系运算符.
按位与运算
按位与运算将两个运算分量的对应位按位遵照以下规则进行计算:
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
即同为 1 的位,结果为 1;否则结果为 0 .
按位或运算
按位或运算将两个运算分量的对应位按位遵照以下规则进行计算:
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1
即只要有1个是1的位,结果为1,否则为0.
按位异或运算
按位异或运算将两个运算分量的对应位按位遵照以下规则进行计算:
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0
即相应位的值相同的,结果为 0,不相同的结果为 1.
可以方便的交换两个值.
#include <stdio.h>
main()
{
int i=10;
int j=1;
i=i^j;
j=j^i;
i=i^j;
printf("i=%d, j=%d\n",i,j);
return 0
}
按位取反运算
按位取反运算是单目(一元)运算,用来求一个位串信息按位的反.
char s = 1;
printf("%x\n",~s); //fe, 1111 1110
即为0的位,结果是1;而为1的位,结果是0.
左移运算
左移用来将一个数的各二进制位全部左移N位,右补0.
右移运算
将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0.