[Go版]算法通关村第十一关白银——位运算的高频算法题

目录

专题1:位移的妙用

题目:位1的个数(也被称为汉明重量)

题目链接:LeetCode-191. 位1的个数

解法1:遍历所有位,判断每个位的数字是否是1

Go代码

go 复制代码
func hammingWeight(num uint32) int {
    count := 0
    for i:=0; i<32; i++ {
        count += int((num >> i) & 1)
    }
    return count   
}

或者

go 复制代码
func hammingWeight(num uint32) int {
    count := 0
    for i:=0; i<32; i++ {
        if num & (1 << i) != 0 {
            count++
        }
    }
    return count   
}

解法2:依次消除每个1的位 num=num&(num-1)

Go代码

go 复制代码
func hammingWeight(num uint32) int {
    count := 0
    for num != 0 {
        // 除了最后1个1在&之后被去掉了,前面的&之后 1还是1 0还是0
        num = num & (num-1)
        count++
    }
    return count
}

题目:比特位计数

题目链接:LeetCode-338. 比特位计数

思路分析:遍历每个数,使用上面的位1的个数计算即可

Go代码

go 复制代码
func countBits(n int) []int {
    ret := make([]int, 0)
    for i:=0;i<=n;i++ {
        ret = append(ret, hammingWeight(i))
    }
    return ret
}

func hammingWeight(n int) int {
    count := 0
    for n != 0 {
        n = n & (n-1)
        count++
    }
    return count
}

题目:颠倒二进制位

题目链接:LeetCode-190. 颠倒二进制位

思路分析:获得低位的数值,左移到高位去

Go代码

go 复制代码
func reverseBits(num uint32) uint32 {
    var ret uint32
    for i,j:=0,31; i<32 && j>=0; i,j=i+1,j-1 {
        v := num >> i & 1
        ret = ret | (v<<j)
    }
    return ret
}

专题2:位实现加减乘除

题目:两整数之和

题目链接:LeetCode-371. 两整数之和

思路分析:a&b<<1得进位,a^b得非进位

Go代码

go 复制代码
func getSum(a int, b int) int {
    for b!= 0 {
        carry := (a & b)<<1 //计算进位
        a = a ^ b  //计算非进位部分的和
        b = carry   //更新 b 为进位
    }
    return a
}

题目:递归乘法

题目链接:LeetCode-面试题 08.05. 递归乘法

思路分析:循环 + 位移

在循环中不断将其中一个数加倍(左移),然后根据另一个数的每一位是否为1,来决定是否将加倍后的数累加到最终的结果中。

Go代码

go 复制代码
func multiply(A int, B int) int {
    min := getMin(A, B)
    max := getMax(A, B)
    ret := 0
    for min != 0{
    	//位为1时才更新到ret,否则max一直更新
        if min & 1 == 1 {
            ret += max
        }
        min = min >> 1  //min除以2
        max = max << 1  //max乘以2
    }
    return ret
}
func getMin(a int, b int) int {
    if a >= b {
        return b
    }
    return a
}
func getMax(a int, b int) int {
    if a >= b {
        return a
    }
    return b
}
相关推荐
find1star4 小时前
LeetCode 141:环形链表
java·算法·leetcode·链表
迅翼SwiftWing4 小时前
编队系列(总)|固定翼编队如何实现稳定飞行?通信架构、协同算法与工程约束深度解析
算法·架构
LB21124 小时前
力扣160 21 86
算法·leetcode·职场和发展
小智老师PMP5 小时前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理
HugoStudio_SWAN5 小时前
洛谷 B4450 / B3867 / B3923 智慧购物、储蓄与做题——从程序到生活
c++·学习·程序人生·算法·生活
a187927218316 小时前
【算法】动态规划第二篇:双序列 DP 三课——继承、计步与断链
算法·leetcode·动态规划·dp·回溯·暴力·算法讲解
江畔柳前堤6 小时前
前台·中台·后台:2026年AI原生时代的架构全景图
开发语言·人工智能·算法·机器学习·架构·scala·ai-native
文心快码BaiduComate7 小时前
2026 OPC x AI Coding 趋势案例交流会圆满落幕:一个人就一支研发团队
算法
ACM-moran7 小时前
条件显化(二分单峰函数+构造数列)
算法·推公式·整数三分
闻缺陷则喜何志丹7 小时前
【栈 运算系统】P3719 [AHOI2017初中组] rexp|普及+
c++·算法··洛谷·运算系统