压缩dp用到了二进制位运算上的东西,整理一下基本内容。
位运算的几个基本操作:
1、移位(<< >>)
2、按位与(&)
3、按位或(|)
4、非(~)
5、异或(&)
每个都很简单,c++上都学过,难的实在那几个巧妙的利用上。
1、判断一个数二进制下第i位是0或1 (x & (1<<(i-1)))>0
1<<(i-1)构造出来(...100...)(后面i-1个0),与x做与运算;由于其他位都是0,故相当于只有第i位在做与运算,而构造出来的为1,所以相当于只判断x的第i位。同理,可用(3<<(i-1))、(5<<(i-1))...判断x的连续几位。
2、把x的第i位改为1 x=(x |(1<<(i-1)))
同上。
3、把x的第i位改为0 x=(x & ~(1<<(i-1)))
~(1<<(i-1))相当于构造出来(111101111)(只有第i位为0)的数,做与运算第i位一定为0.
4、把x二进制下最靠右的第一个1去掉 x=(x & (x-1))