位运算是指按二进制进行的运算。在程序中,常常需要处理二进制位的问题。C/C++语言提供了6个位操作运算符。这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型。
在实际应用中,建议用unsigned整型操作数,因为带符号操作数可能因为不同机器结果不同。
下面是C/C++位操作运算符列表,其中运算符优先级为从上到下递减,注意:<<,>>优先级相同。
操作符 | 功能 | 用法 |
~ | 位求反 | ~expr |
<< | 左移 | expr1 << expr2 |
>> | 右移 | expr1 >> expr2 |
& | 位与 | expr1 & expr2 |
^ | 位异或 | expr1 ^ expr2 |
| | 位或 | expr1 | expr2 |
代码示例如下:
#include<iostream>
using namespace std;
int main(){
unsigned short x=3,y=5;
cout<<"~x="<<(unsigned short)~x<<endl;//位求反
cout<<"~x="<<~x<<endl;//位求反
cout<<"x&y="<<(x&y)<<endl;//位与
cout<<"x^y="<<(x^y)<<endl;//位异或
cout<<"x|y="<<(x|y)<<endl;//位或
cout<<"x<<1="<<(x<<1)<<endl;//位左移
cout<<"y>>1="<<(y>>1)<<endl;//位右移
return 0;
}
运算结果如下:
~x=65532
~x=-4
x&y=1
x^y=6
x|y=7
x<<1=6
y>>1=2
代码解释如下:
short为16位整数,故x,y的二进制表示如下:
x=3(00000000 00000011)
y=5(00000000 00000101)
~ 00000000 00000011
= 11111111 11111100(65532或者-4)(至于为什么同样的二进制位表示的数不一样,这与计算机的数值表示有关,具体原因可搜索“补码”)
00000000 00000011
& 00000000 00000101
= 00000000 00000001(1)
00000000 00000011
^ 00000000 00000101
= 00000000 00000110(6)
00000000 00000011
| 00000000 00000101
= 00000000 00000111(7)
00000000 00000011<<1
= 00000000 00000110(6)
00000000 00000101>>1
= 00000000 00000010(2)