位运算小技巧总结
异或
a^a = 0
a^0 = a
a^b != 0(a与b的不同的位异或之后为1,可以用来将a和b分两组)
num&(num-1)
去掉num最低位的1,如1010&1001=1000
num&(~(num-1))
只剩下最低位的1,如1010&0110=0010
将a的第i位置1
其中i&0x1F是要保证左移的位数小于32
void set(int& a,int i) { a |= (1<< (i & 0x1F));}
将a的第i位清0
同理,其中i&0x1F是要保证左移的位数小于32
void clr(int& a,int i) { a &= ~(1<<(i & 0x1f));}