leetcode算法总结 —— 位运算

异或

二进制中异或,0^0 = 0 , 0异或1 和1异或1都为1

a ^ b = n

a = 8 的二进制是 1000,b = 13 的二进制是 1101。
得到 n = 0101

  1. 在n的二进制中:ab不同的位为1,相同的位为0
      1. 汉明距离
  2. a^b----还相当于 二进制的无进位相加,得到0101

a ^ a = 0; a ^ 0 = a

    1. 只出现一次的数字

与运算

二进制位对应& 则1&1为1,1&0,0&0都为0

a & b = n

在n的二进制中:ab位都是1的时候n对应的位为1,其余的位为0

(n & 1) == 0

判断最后一位是0还是1
(n & 1) == 0说明n是偶数
(n & 1) == 1则n是奇数

    1. Pow(x, n)

n = n & (n - 1)

这个操作是算法中常见的,作用是去掉数字 n 的二进制表示中的最后一个 1。

统计整数n二进制中1的个数

    while(n != 0) {
    
    
        n = n & (n - 1); //消除n的二进制的最后一个1
        count++;
    }
    1. 位1的个数
    1. 比特位计数(dp)
    1. 2的幂(2的n次方,则说明这个数二进制只有第一位是1,反之也成立)
    1. 4的幂(先判断是否是2的幂,然后判断奇数位是1)

n = n & (-n)

类似于上面的但是他是只保留了n的二进制中的最后一个1,比如0010,前面的1都去掉,只保留最后一个1

    1. 只出现一次的数字 III

(a&b)<<1

求的是a+b的二进制进位数,得到10000

    1. 两整数之和
  • 剑指 Offer 65. 不用加减乘除做加法

左右移位

位运算速度要大于乘除法
n>>1 是n/2
n<<1是n*2

猜你喜欢

转载自blog.csdn.net/chongbin007/article/details/115269114
今日推荐