Skip to content

Latest commit

 

History

History
48 lines (47 loc) · 1.59 KB

位运算.md

File metadata and controls

48 lines (47 loc) · 1.59 KB

位运算特点

  • 与 &

    1 & 1= 1; 1 & 0 = 0; 0 & 0 = 0; 两个位都为1时结果才为1 其他都为0 跟1与的任何值结果都为本身 跟0与的任何值都为0

  • 或 |

    1 | 1 =1; 1 | 0 = 1; 0 | 0 = 0; 两个位都为0是结果才为0 其他都为1 跟1或的任何值都为1 跟0或的任何值都为本身

  • 非 ~

    ~ 1 = 0; ~ 0 = 1

  • 异或 ^

    1 ^ 1 = 0; 1 ^ 0 = 1; 0 ^ 0 = 0; 1 ^ 1 ^ 1 = 1; 1 ^ 0 ^ 0 = 1; a ^ a = 0; a ^ a ^ b = b; 任何一个数与本身异或结果为0

  • 左移 <<

    0010 << 1 = 0100 末尾补0 移动一次相当于乘以2

  • 有符号右移 >>

    0100 >> 1 = 0010; 1100 >> 1 = 1110 首位补符号位 移动一次相当于除以2

  • 无符号右移 >>>

    0100 >>> 1 = 0010; 1100 >>> 1 = 0110 首位补0 正数相当于有符号右移

常用场景

  • 取特定bit位的值

    m & 2 ^ (x-1) x为bit位序号,从右开始

  • 将数字二进制位最后一个为1的bit位置为0

    m & (m - 1)

  • 获取数字二进制位中最后一个为1的bit位

    m & (-m)
    因为 -m = ~m + 1 m = 14 00001110 -m = ~m + 1 11110010 m & -m 00000010

  • 数组中一个元素出现了奇数次 其他元素出现偶数次

    所有元素异或

  • 汉明重量 统计数字二进制位中1的个数

    m & 1 得到末尾元素的值,循环右移m或者左移1,得到每位的值 迭代n次 n为int的总位数 m & (m - 1) 每次消去一个1,直到结果m为0 迭代x次 x为1的个数 极端情况下全为1