先介绍一些位运算的技巧:
&: 0&0==0&1==1&0==0 1&1==1
|: 0|1 ==1|0 == 1|1 ==1 0|0==0
我们程序里的所有数在内存里都是以二进制的形式存储的,位运算就是直接对这些二进制数进行运算。
1. 位与运算 &
相同位数的两个数都为1,就为1,如果有其中一个不是1,则为0。
1101 & 1100 == 1100
用任意一个数&1就可以取到末位的数字。这样一来就可以判断奇偶性。
2&1 == 10&1 == 10&01==0
2.位或运算 |
只要一个位为1,,那么就为1。
1100 | 0001 == 1101
这个操作可以保存两个数中的1。
3.位异或^
0 xor 0 == 1 xor 1== 0,1 xor 0 == 0 xor 1==1
相同为0,不同为1。
1011^0101==1110
一个数连续异或两次相同的数就可以得到它本身。有了这个性质,就可以实现两个变量数据的交换。
#include<iostream> using namespace std; int main() { int i,j; while(cin>>i>>j) { //swap(i,j); i=i^j; j=i^j;//j <- (i^j)^j==i i=i^j;//i <- (i^j)^i==j cout<<i<<" "<<j<<endl; } return 0; }
4.取反运算~
5.左移<<
这个能将末尾数字向左移动,移动后后面的位置添加0
1111<<2 == 1100
这样可以直接进行*2的运算
6. 右移>>