位操作在算法中的运用
1. 与操作&
100 & 111 = 100
2. 或操作|
100 | 000 = 100
3. 异或^
100 ^ 000 = 100
4. 取反~
~100 = 011
5. 向左移位<<
1<<2 = 100
即2的2次方,等于4
6. 向右移位>>
16>>2 = 00100
即16的2的-2次方,等于4
note1:
移位和与操作结合,用来判断一个数的某一位是否为1,这个功能可以用在subset,即子集问题中。
例如:
判断数字8的第三位是否为1?
8&(1>>3)==1?
note2:
移位和或操作结合,用来将一个新的二进制位存储到一个整形数中,这个功能常用于优化内存,或者某些棋盘类型的问题中。
例如:将下面的棋盘保存为一个整形数
1 0
0 1
int a = 0;
a |=(number<<i)
note3:
移位和异或操作结合,用来将数字的某一位取反,用在棋盘类型的问题中。
例如:
1 0
0 1
转为1001
若对坐上角1取反,则结果应为1001^=(1<<3)
即
1001
^ 1000
=----------------
0001