位运算
位运算就是基于整数的二进制表示进行的运算。由于计算机内部就是以二进制来存储数据,位运算是相当快的。
基本的位运算共6种,分别为按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、左移(<<)和右移(>>)。
与(&)、或(|)、异或(^)
| 运算 | 运算符 | 数学符号 | 解释 |
| 与 | & | &、and | 只有两个都为1时才为1 |
| 或 | | | |、or | 只要其中一个为1时就为1 |
| 异或 | ^ | ^、xor | 只有两个不同时才为1(异为1,同为0) |
举例:
&
0010 1101 & 0001 0111 = 0000 0101
|
0010 1101 | 0001 0111 = 0011 1111
^
0010 1101 ^ 0001 0111 = 0011 1010
异或(^)的小技巧
在程序中如果要交换两数的值,通常的做法是声明一个中间变量t来实现交换
如果用^来运算的话则不需要额外声明中间变量
例如:
int a = 15, b = 17;
cout << a << ' ' << b << endl;
a ^= b;
b ^= a;
a ^= b;
cout << a << ' ' << b << endl;
输出结果:
15 17
17 15
此外,一个变量对同一个数异或两次变量的值还是原来的值
例如:
int a = 15, b = 17;
cout << a << ' ' << b << endl;
a ^= b;
a ^= b;
cout << a << ' ' << b << endl;
输出:
15 17
15 17
取反(~)
顾名思义,在二进制中取反就是0变成1,1变成0
例:~0010 1011 = 1101 0100
左移(<<)、右移(>>)
num << i 表示将 num 的二进制表示向左移动 i 位所得的值。
num >> i 表示将 num 的二进制表示向右移动 i 位所得的值
举例:
0001 0110 << 2 = 0101 1000
0001 0110 >>2 = 0000 0101
num<<i 可以看作是把num乘2的i次幂倍(在不超过指定范围内)
如15<<1 结果为30(15*2) 15<<2 结果为60(15*4)
反之>>可看作<<的相反操作

浙公网安备 33010602011771号