状压DP——关于位运算

位运算就是直接对整数在内存中的二进制位进行操作。简单的说就是二进制计算,我们的状压DP是通过将状态转为二进制的01来表示再转为十进制存到数组中来达到压缩状态,所以要学好状压,一定要学好位运算.

& and

&,也就是and,“按位与”,也就是两个二进制数每一位与每一位进行计算,如果都为1则返回1
如1011与0101进行&运算则得到0001,如下图状压DP——关于位运算

| or

|,也就是or,“按位或”,就是两个二进制数各个数字一一进行比较,如果两个数其中一个为1则返回1
如1011和0101进行|运算则得到1111,如下图:
状压DP——关于位运算

^ nor

^,也就是nor,“按位异或”,其运算内容则是两个二进制数逐位进行比较,如果这两个数相同则返回0,不同则返回1。如1011和0101进行“异或”运算则为1110
状压DP——关于位运算

<< 左移

<<,b左移a位,意为在一个二进制b的数字末尾添a个0,也就是乘以2的次方,如1011左移一位则得到10110,转换成十进制也就是给原数2,但是这是运算,是在电脑自己内存的二进制位中进行操作的,回比乘法运算快一些,如果以后会重复进行2运算时,最好写<<1来代替。

<<右移

和左移差不多,b左移a位,意为b在末尾减a个零,也就是除以2的次方。当然,也会比直接除要快一些。