位运算在状态压缩DP中的应用
Posted little-turtle--qjy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了位运算在状态压缩DP中的应用相关的知识,希望对你有一定的参考价值。
一、判断一个数字X的i位是不是1
方法:
if((1 << (i-1)) & x > 0)
原理:
1左移(i-1)位,相当于制造了一个就i位上是1其他位都是0的一个二进制数。将这个数与X进行“与”运算,如果大于0,则代表第i位是1;否则是0
例子:
x = 13 (1101)2 i = 3
∴ 1 << (i-1) = 1 << 2 = 1002 = 01002 (补上0)
∴ (1 << (i-1)) & x
= 01002 & 11012
= 01002
因为其0100大于0,所以这i位是1
二、把一个数字二进制下的第i位改成1
方法:
x = x | (1 << (i-1))
原理:
与“一”类似,直接看”例子“吧
例子:
x = 13 (1101)2 i = 2
∴ 1 << (i-1) = 1 << 1 = 102 = 00102
∴ x | (1 << (i-1))
= 11012 | 00102
= 11112
三、把一个数字二进制下的最靠右的第一个1改成0(去掉)
方法:
x = x & (x-1)
原理:
十进制下的数减了1后,二进制下的数最右边的1肯定会变成0,所以通过“与”一下就可以把最靠右的第一个1改成0
例子:
x = 13 (1101)2
∴ x-1 = 12 = 11002
∴ x & (x-1)
= 11012 & 11002
= 11002
以上是关于位运算在状态压缩DP中的应用的主要内容,如果未能解决你的问题,请参考以下文章