位运算(状压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)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

部分来自百度百科。

上一篇:CF718D Andrew and Chemistry


下一篇:蓝桥杯练习