位运算(状压DP基础)
作者:互联网
运算符号
一.含义
含义 | c++ |
按位与 | a&b |
按位或 | a|b |
按位异或 | a^b |
按位取反 | ~a |
左移 | a<<b |
右移 | a>>b |
1.&运算(and)
同真则为真,不同则为假。
常用于二进制的取位操作。
a&1的结果就是a二进制的最末位
2.|运算(or)
有真则为真,同假则为假。
通常用于二进制特定位上的无条件赋值。
a|1即把a二进制末位强行变成1,
若需要把二进制末位变成0,则x|1再减1即可,其实际意义就是把这个数强行变成最接近的偶数。
3.^运算(xor)
不同则为真,相同则为假。
1,a^0=a,
2,a^a=0,
3,a^b^b=a,
4,a^b=b^a,
5,a^b^c=a^(b^c)=(a^b)^c;
4.~运算(not)
a=~a表示将a二进制中的1全部变成0,0全部变成1
对无符号整数类型使用,得到的值便是它与该类型上界的差。
5.<<运算(shl)
a<<b即将a的二进制左移b位(低位用0补齐),但高位超出类型限制的便会自动踢出,使用时要注意有符号类型的最高位为符号位。
6.>>运算(shr)
a>>b即将a的二进制右移b位(高位除符号位用0补齐),低位自动踢出。
二.优先级
优先级别 | 运算符 |
1 | ~ |
2 | <<,>> |
3 | & |
4 | ^ |
5 | | |
6 | &=,^=,|=,<<=,>>=,~= |
三.简单应用
功能 | 示例 | c++表示 |
去最后一位 | (110011)->(11001) | x>>1 |
在最后加0 | (11011)->(110110) | x<<1 |
在最后加1 | (11011)->(110111) | (x<<1)+1 |
把最后一位变1 | (11010)->(11011) | x|1 |
把最后一位变0 | (11011)->(11010) | (x|1)-1; |
最后一位取反 | (11011)->(11010) | x^1 |
把右数第k位变成1 | (11011)->(11111)(k=3) | x|(1<<(k-1)) |
把右数第k位变成0 | (11011)->(10011)(k=4) | x&~(1<<(k-1)) |
右数第k位取反 | (11011)->(10011)(k=4) | x^(1<<(k-1)) |
取末三位 | (11011)->(011) | x&7 |
取末k位 | (11011)->(11)(k=2) | x&((1<<(k+1))-1) |
取右数第k位 | (11011)->(1)(k=2) | (x>>(k-1))&1 |
把末k位变成1 | (11000)->(11011)(k=2) | x|(1<<(k-1)) |
末k位取反 | (11000)->(11011)(k=2) | x^(1<<(k-1)) |
把右边连续的1变成0 | (01011)->(01000)(k=2) | x&(x+1) |
把右起第一个0变成1 | (11101)->(11111) | x|(x+1) |
把右边连续的0变成1 | (11001)->(11111) | x|(x-1) |
取右边连续的1 | (10111)->(111) | (x^(x+1))>>1 |
去掉右起第一个1的左边 | (11010)->(10) | x&(x^(x-1)) 或 x&(-x) |
从右边开始,把最后一个1改写成0 | (11010)->(11000) | x&(x-1) |
部分来自百度百科。
标签:运算,二进制,状压,11010,11011,取反,变成,DP 来源: https://www.cnblogs.com/liyikang/p/15895440.html