状态压缩DP常遇到的位运算

位操作一共有6种形式:<<,>>,&,|,^,~;

1.左移操作符<<:左移操作符将整数的二进制向左移若干位,将最高若干位挤掉,并在低位补0

如:

int a=3;            //a=000000000000000000000000000000011=3
int b=a<<1;         //b=000000000000000000000000000000110=6
int c=a<<3;         //c=000000000000000000000000000001100=12

实际上:a<<1,a右移1位表示a*2,a<<m表示a*2^m

2.右移操作符>>:右移操作符将整数的二进制向右移若干位,将最低若干位挤掉,并在高位补0或者1

int a =10;         //a=000000000000000000000000000001010=10int b = a>>1;      //b=000000000000000000000000000000101=5
int c = a >> 2;    //c=000000000000000000000000000000010=2

右移操作符就是不断的做除2^m的运算。

3.位与操作&:位与操作是将两个数的二进制的每一位左与操作:例如:

int a = 6, b = 10;int c = a&b;         //则 c = 2;//(000000000000000000000000000000110)&(000000000000000000000000000001010)
//=000000000000000000000000000000010

4.位或操作符|:将两个整数二进制的每一位做或操作运算。

int a = 6, b = 10;
int c = a|b;         //则 c=14;
//(000000000000000000000000000000110)1(000000000000000000000000000001010)
//=000000000000000000000000000001110

5.位异或操作符^:将两个操作数每一位做异或操作(相同为0,不同为1)

int a = 6, b = 10;
int c = a^b;         //则 =12;
//(000000000000000000000000000000110)^(000000000000000000000000000001010)
//=000000000000000000000000000001100

6位反操作~:将操作数的二进制每一位按位取反,0变为1,1变为0.

int a = 6;
int b = ~a; //b=-7
//b=~(000000000000000000000000000000110)=11111111111111111111111111111001

位操作相对乘法快很多,将所有对2的乘法运算转换为位移运算,可提高程序的运行效率。在C/C++中还有一类复合的位运算符:&=、!=、>>=、<<=和^=

其实a&=b;等价于a=a&b;依次类推。

时间: 2024-11-01 09:37:07

状态压缩DP常遇到的位运算的相关文章

poj 3311 Hie with the Pie(状态压缩dp)

Description The Pizazz Pizzeria prides itself in delivering pizzas to its customers as fast as possible. Unfortunately, due to cutbacks, they can afford to hire only one driver to do the deliveries. He will wait for 1 or more (up to 10) orders to be

poj 3254 Corn Fields(状态压缩dp)

Description Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ 12) square parcels. He wants to grow some yummy corn for the cows on a number of squares. Regrettably, some of the squares are infertile and

poj 2411 Mondriaan&#39;s Dream(状态压缩+dp)

 题意:用1*2砖块铺满n*m的房间. 思路转自:http://www.cnblogs.com/scau20110726/archive/2013/03/14/2960448.html 因为这道题输入范围在11*11之间,所以可以先打表直接输出.......... 状态压缩DP 经典覆盖问题,输入n和m表示一个n*m的矩形,用1*2的方块进行覆盖,不能重叠,不能越出矩形边界,问完全覆盖完整个矩形有多少种不同的方案 其中n和m均为奇数的话,矩形面积就是奇数,可知是不可能完全覆盖的.接着我们来看

POJ 3691 (AC自动机+状态压缩DP)

题目链接:  http://poj.org/problem?id=3691 题目大意:给定N的致病DNA片段以及一个最终DNA片段.问最终DNA片段最少修改多少个字符,使得不包含任一致病DNA. 解题思路: 首先说一下AC自动机在本题中的作用. ①字典树部分:负责判断当前0~i个字符组成的串是否包含致病DNA,这部分靠字典树上的cnt标记完成. ②匹配部分:主要依赖于匹配和失配转移关系的计算,这部分非常重要,用来构建不同字符间状态压缩的转移关系(代替反人类的位运算). 这也是必须使用AC自动机而

POJ 3254 Corn Fields(状态压缩DP)

Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4739   Accepted: 2506 Description Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ 12) square parcels. He wants to grow some yumm

pojPOJ 2411--Mondriaan&#39;s Dream+状态压缩dp

又是一道经典的状态压缩dp 开始自己想了一下,总是觉得因为这个小矩形可以竖着放导致没法确定状态如何转移(第i行的小矩形如果竖着放,及可能影响i-1行,也有可能影响i+1行);后面看了别人的题解后,才知道原来我们可以固定小矩形竖着放的时候只能向前放,这样第i行的状态就只能影响i-1行了,也就能顺利的写出状态转移方程啦. 设dp[i][j]表示第i行处于状态j的时候,共有多少种放置方法. dp[i][j]=sum(dp[i-1][k]),其中状态j和k要能共存,并且j和k要使得第i-1行刚好铺满.

北大ACM2686——Traveling by Stagecoach~~状态压缩DP

最近才看书,看到状态压缩.对于状态压缩DP,其实就是集合上的DP. 这需要我们了解一些位运算: 集合{0,1,2,3,....,n-1}的子集可以用下面的方法编码成整数 像这样,一些集合运算就可以用如下的方法来操作: 1.空集....................0 2.只含有第i个元素的集合{i}................1 << i 3.含有全部n个元素的集合{0,1,2,3,....,n - 1}.............(1 << n) - 1 4.判断第i个元素是

poj3254--Fields+状态压缩dp

第一道状态压缩dp :) 考虑每一行的情况,如果我们令0表示不可以放牧1表示放牧,那么这一行所有可行的情况都可以穷举出来并对应到一个十进制的数:这就是状态压缩.再由题目可以知道每一行的状态可不可以出现只和它前面的那一行有关,所以我们可以定义 dp[i][j]表示第i行处于第j种状态的时候有多少种放牧的方法: dp[i][j]=dp[i-1][j1]+dp[i-1][j2]+....+dp[i-1][jn],其中j要和jn能同时出现. 由这个方程我们就可以写程序了,我们可以选择用一个数组来表示状态

HDU 3001 Travelling(状态压缩DP+三进制)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 题目大意:有n个城市,m条路,每条路都有一定的花费,可以从任意城市出发,每个城市不能经过两次以上,要求经过所有城市并且花费最少,求出最小花费. 解题思路:三进制的状态压缩DP,跟二进制还是有一点不一样的,因为三进制没有直接的位运算,还要自己先做处理利用num[i][j]记录数字i各位的三进制表示方便计算,其他的就跟二进制状态压缩没有太大区别了.还有注意: ①开始要将n个起点初始化,dp[bit