位运算
-
左移运算符(<<)
把一个整型数的所有位向左移动指定的位数,并从右边界移入0。
例:14<<2
这里的整型数为14,指定的位数为2,所以值为56
14转化为二进制为1110,56转化为二进制为111000
实际上可以看成14*4 -
左移运算符(>>)
同上 -
&(and)
相同位的两个数字都为1,则为1;若有一个不为1,则为0。
判断二进制下有没有间隔为n的1(错位&)bool judge(int x) { return (x&(x<<n)); }
判断相同位的两个数字都为1
bool judge(int x,int y) { return (x&y); }
-
|(or)
相同位只要一个为1即为1。if((s|t)!=((1<<n)-1)) //如果存在s和t相同位都是0的时候
-
^(xor)
相同位不同则为1,相同则为0。s2=s1^(1<<i) //当s1第i位为1的时候,把它去除
-
~(not)
0和1全部取反。
状态压缩dp
我们知道,用DP解决一个问题的时候很重要的一环就是状态的表示,一般来说,一个数组即可保存状态。但是有这样的一些题目,它们具有DP问题的特性,但是状态中所包含的信息过多,如果要用数组来保存状态的话需要四维以上的数组。于是,我们就需要通过状态压缩来保存状态,而使用状态压缩来保存状态的DP就叫做状态压缩DP。
和普通dp一样要注意初始化和状态转移方程,唯一的不同是状态压缩dp的状态可以是地图里的一行,可以是走过的路径,等等.....