位运算基础

位运算

    • 1.什么是位运算
    • 2.位运算有哪些
    • 3.常用的位运算操作

基础知识和算法合集:https://blog.csdn.net/GD_ONE/article/details/104061907

1.什么是位运算

 位运算又称为位操作,指的是直接对二进制位进行的一系列操作。

2.位运算有哪些

  1. AND( & )
    按位与
    1 & 1 = 1
    1 & 0 = 0
    0 & 0 = 0
    1101 & 1100 = 1100

  2. OR( | )
    按位或
    1 | 1 = 1
    1 | 0 = 1
    0 | 0 = 0
    1001 | 1010 = 1011

  3. XOR( ^ )
    按位异或
    1 ^ 1 = 0
    0 ^ 0 = 0
    1 ^ 0 = 1
    0 ^ 1 = 1
    1101 ^ 1100 = 0001

  4. NOT( ~ )
    取反
    ~1 = 0
    ~0 = 1
    ~0111 = 1000
    另:& | ^ ~ 是c或类c的编程语言中所用的位操作符。 除了~是单目运算符
    其余的三个都是双目运算符。

  5. 移位运算

    • 左移运算符: <<

      二进制表示下把数字同时向左移, 低位以0填充, 高位越界后舍弃。

    • 右移运算符: >>
      右移运算又分为算术右移和逻辑右移。
      • 算术右移:

        在二进制补码表示下,把数字同时向右移位,高位以符号位填充,低位越界后舍弃。

        对于 n >> 1 在C/C++中相当于 n/2 下取整。

      • 逻辑右移:

        在二进制补码表示下把数字同时向右移动,高位以0填充,低位越界后舍弃。

        C++并没有规定右移的方式,所以编译器不同,可能实现的方式也不一样。
        不过说了这么多,总结下来其实就是:
        00001 << 2 = 00100
        00100 >> 2 = 00001

3.常用的位运算操作

  1. (n>>k) &1 取出整数n在二进制表示下的第k位

  2. n & ((1 << k) - 1) 取出整数n在二进制表示下的第0~k-1位(后k位)

  3. n ^ (1 << k) 把整数n在二进制表示下的第k位取反

  4. n | (1 << k) 把整数n在二进制表示下的第k位赋值为1

  5. n & (~(1 << k)) 把整数n在二进制表示下的第k位赋值为0

  6. n ^ (1 << k) = n - (1<

  7. 除以2
    a / 2 = a >> 1
    a + b / 2 == a + b >> 1 ( + - 运算的优先级高于 <<, >> )

  8. 判断奇偶
    一个数的二进制数的最低位如果是1 则该数一定是奇数 否则一定是偶数
    所以 用 a & 1 检测最低为是否位1

    if(a & 1) cout<<"奇数";
    else cout<<"偶数" 
    
  9. 快速幂

  10. 状态压缩
    以一个二进制数表示一个状态集合。
    如 n = 1100 S = {2, 3} S表示状态所有为1的集合。

  11. 成对变换

    当n 为偶数时 n ^ 1 = n + 1
    当n为奇数时 n ^ 1 = n - 1
    所以
    (0,1) (2, 3) (4, 5)… 关于 ^1 运算 构成“成对变换”
    这一性质常用于图论邻接表中边集的存储。在具有无向边(双向边)的图中把一对正反方向的边分别存储在邻接表数组中的第n和第n+1位置(n为偶数),就可以通过^1
    的运算获得与当前边(x, y) 反向的边(y, x)的存储位置。
    摘自<<算法竞赛进阶指南>>

  12. lowbit运算

    lowbit(n) 定义为非负整数n在二进制表示下"最低为1及其后边所有0"构成的数值. 例如 n = 10
    的二进制表示为(1010)2, 则lowbit(n) = 2 = (10)2 .
    lowbit(n) = n & (~n + 1) = n&(-n)
    摘自<<算法竞赛进阶指南>>

你可能感兴趣的:(#,位运算)