位操作符就是把整型看作二进制为的序列,然后然后对每个位分别进行位操作。由于二进制每个位只可能是0或1,因此一些类似逻辑操作的运算可以运用在每一位上,也就是位与、位或、位求反和位异或。
//c++位操作符
操作符 | 说明 |
& | 位与,如a&b |
| | 位或,如a|b |
^ | 位异或,如a^b |
~ | 位求反(非),如~a |
<< | 左移, 如a<<b |
>> | 右移,如a>>b |
//位与、位或、位异或、在不同二进制数值组合下的运算结果:
p | q | p&q | p|q | p^q |
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
除此之外,位求反就是简单的将0变成1,将1变成0.
//位操作符
#include <iostream>
using namespace std;
//位操作符
int main()
{
int a = 1; //0b01
int b = 3; //0b11
cout <<"a & b: " << (a & b) << endl;
cout <<"a | b: " << (a | b) << endl;
cout <<"a ^ b: " << (a ^ b) << endl;
cout <<"~a : " << (~a) << endl;
return 0;
}
程序的注释中标注了数字的二进制形式,分别是01和11.可以看到由于两个数的高一位并不都是1,因此位与的结果是0,而低一位都是1,所以结果是1,和在一起是01,也就是十进制的1.其他的以此类推。位或:二进制11,十进制3;位异或:二进制 10,十进制 2;位求反:二进制10,十进制2.
//左移和右移符操作符
左移和右移操作符就是把整型的每一位都左移或右移,例无符号二进制数01001001b,左移一位,右边补0,在左移一位,最左边的1才会移除,右移则相反。
#include<iostream>
using namespace std;
//左移和右移操作符
int main()
{
unsigned int a = 4;
cout << "a << 1: " << (a<<1) << endl;
cout << "a >> 1: " << (a>>1) << endl;
return 0;
}
输出结果为:a<<1 :8
a>>1 :2
//自增自减操作符
自增自减操作符其实就是对操作数进行加一或者减一。一些计算机指令中存在着不同于加法add和减法sub的加一Inc和减一dec指令,但加一和减一有自己的操作符,可以直接对应。
自增自减操作符分别有前缀和后缀两种形式:前缀自增、自减是先进行运算然后得到表达式的返回值;而后缀自增、自减则是先返回值,在进行运算。
//自增自减操作符
操作符 | 说明 |
++ | 自增,如a++(后缀形式)或++a(前缀形式) |
-- | 自减,如a-- (后缀形式)或--a(前缀形式) |
#include<iostream>
using namespace std;
//自增自减操作符
int main()
{
int a = 2 ;
cout << "a = " << a << endl;
cout << "++a=" << ++a << endl;
cout << "a++=" << a++ << endl;
cout << "--a=" << --a << endl;
cout << "a--=" << a-- << endl;
return 0;
}
结果 :
这个结果可能会让人感到困惑,为什么a经过了两次递增,两次递减,结果却是3呢?
这是因为在a++之后先返回了原来a的值3,再加一个成为4,之后自减由于是--在前,则4-1成为3后返回给了cout,最后一个a--与a++类似,返回3的a的最终值为2.