状态压缩 DP 用二进制来表示状态,而二进制数的处理需要用到各种位运算。
C 语言的位运算有 “&”,“|”,“^”,“<<”,">>"等,下面是例子。
#include<bits/stdc++.h>
int main(){
int a = 213, b = 21; //a = 1101 0101 , b= 0001 1001
printf("a & b = %d\n",a & b); // AND = 17, 二进制0001 0001
printf("a | b = %d\n",a | b); // OR = 221, 二进制1101 1101
printf("a ^ b = %d\n",a ^ b); // XOR = 204, 二进制1100 1100
printf("a << 2 = %d\n",a << 2); // a*4 = 852, 二进制0011 0101 0100
printf("a >> 2 = %d\n",a >> 2); // a/4 = 53, 二进制0011 0101
int i = 5; //(1)a的第i位是否为1
if((1 << (i-1)) & a) printf("a[%d]=%d\n",i,1); //a的第i位是1
else printf("a[%d]=%d\n",i,0); //a的第i位是0
a = 43, i = 5; //(2)把a的第i位改成1。a = 0010 1011
printf("a=%d\n",a | (1<<(i-1))); //a=59, 二进制0011 1011
a = 242; //(3)把a最后的1去掉。 a = 1111 0010
printf("a=%d\n", a & (a-1)); //去掉最后的1。 =240, 二进制1111 0000
return 0;
}