Go 语言位运算符全面总结

news/2026/1/17 14:01:59/文章来源:https://www.cnblogs.com/azy-blog/p/19495914

Go 语言位运算符全面总结

Go 语言位运算符全面总结

📊 位运算符速查表

运算符 名称 示例 结果 记忆技巧
& 位与 (AND) 1010 & 1100 1000 都为1才是1
| 位或 (OR) 1010 | 1100 1110 有1就是1
^ 位异或 (XOR) 1010 ^ 1100 0110 不同为1
&^ 位清除 (AND NOT) 1010 &^ 1100 0010 清除右边为1的位
<< 左移 0011 << 2 1100 乘以2^n
>> 右移 1100 >> 2 0011 除以2^n
^(一元) 位取反 (NOT) ^1010 ...0101 0变1,1变0

🔍 详细功能解析

1. 位与 & - 按位与

// 功能:两个位都为1时结果为1,否则为0
func bitwiseAND() {a := 0b1010  // 10b := 0b1100  // 12result := a & b  // 0b1000 = 8fmt.Printf("%04b & %04b = %04b\n", a, b, result)// 输出: 1010 & 1100 = 1000// 应用场景:// 1. 检查特定位是否为1flags := 0b1101mask := 0b0100  // 检查第2位if flags & mask != 0 {fmt.Println("第2位是1")}// 2. 清除某些位(通过与0相与)clearMask := ^0b0010  // 1110...1101cleared := flags & clearMask  // 清除第1位
}

2. 位或 | - 按位或

// 功能:两个位有1个为1时结果为1
func bitwiseOR() {a := 0b1010  // 10b := 0b1100  // 12result := a | b  // 0b1110 = 14fmt.Printf("%04b | %04b = %04b\n", a, b, result)// 输出: 1010 | 1100 = 1110// 应用场景:// 1. 设置特定位为1flags := 0b0000setMask := 0b0010flags = flags | setMask  // 设置第1位为1// 2. 组合多个标志read := 1 << 0  // 0001write := 1 << 1 // 0010exec := 1 << 2  // 0100permissions := read | write | exec  // 0111
}

3. 位异或 ^ - 按位异或

// 功能:两个位不同时结果为1,相同时为0
func bitwiseXOR() {a := 0b1010  // 10b := 0b1100  // 12result := a ^ b  // 0b0110 = 6fmt.Printf("%04b ^ %04b = %04b\n", a, b, result)// 输出: 1010 ^ 1100 = 0110// 应用场景:// 1. 切换位(0变1,1变0)flags := 0b1010toggleMask := 0b0011toggled := flags ^ toggleMask  // 1001// 2. 交换两个数(不用临时变量)x, y := 5, 9x = x ^ yy = x ^ yx = x ^ y// 现在 x=9, y=5// 3. 加密/解密(相同密钥两次异或得到原值)data := 42key := 123encrypted := data ^ keydecrypted := encrypted ^ key  // 变回42
}

4. 位清除 &^ - AND NOT(Go特有)

// 功能:清除a中在b里为1的位
func bitwiseAndNot() {a := 0b1010  // 10b := 0b1100  // 12result := a &^ b  // 0b0010 = 2fmt.Printf("%04b &^ %04b = %04b\n", a, b, result)// 输出: 1010 &^ 1100 = 0010// 等价于:a & (^b)// 但比 ^ 优先级高,更安全// 应用场景:// 1. 清除特定标志位flags := 0b1111clearMask := 0b1010cleared := flags &^ clearMask  // 0101// 2. 从集合中移除元素(差集)setA := 0b1101  // 元素 {0, 2, 3}setB := 0b0110  // 元素 {1, 2}diff := setA &^ setB  // 1101,移除交集
}

5. 左移 << - 向左移位

// 功能:所有位向左移动,右侧补0
func leftShift() {x := 0b0001  // 1result := x << 3  // 0b1000 = 8fmt.Printf("%04b << 3 = %04b (%d)\n", x, result, result)// 输出: 0001 << 3 = 1000 (8)// 应用场景:// 1. 快速乘以2的幂n := 5doubled := n << 1  // 10times8 := n << 3   // 40// 2. 创建位掩码bit3 := 1 << 3  // 00001000bits2and3 := (1<<2) | (1<<3)  // 00001100// 3. 标志位定义const (FlagA = 1 << iota  // 1FlagB              // 2FlagC              // 4FlagD              // 8)
}

6. 右移 >> - 向右移位

// 功能:所有位向右移动
func rightShift() {x := 0b1000  // 8result := x >> 2  // 0b0010 = 2fmt.Printf("%04b >> 2 = %04b (%d)\n", x, result, result)// 输出: 1000 >> 2 = 0010 (2)// 注意:有符号数和无符号数右移行为不同!// 无符号数:左侧补0// 有符号数:左侧补符号位(算术右移)var u uint8 = 0b10000000  // 128var s int8 = -128          // 二进制也是10000000fmt.Printf("无符号: %08b >> 1 = %08b (%d)\n", u, u>>1, u>>1)fmt.Printf("有符号: %08b >> 1 = %08b (%d)\n", byte(s), s>>1, s>>1)// 应用场景:// 1. 快速除以2的幂(无符号数)n := 16half := n >> 1  // 8// 2. 提取特定位value := 0b11010110bit3 := (value >> 3) & 1  // 提取第3位// 3. 分解字节rgb := 0xFF3366r := (rgb >> 16) & 0xFF  // 红色分量g := (rgb >> 8) & 0xFF   // 绿色分量b := rgb & 0xFF          // 蓝色分量
}

7. 位取反 ^ - 一元运算符

// 功能:所有位取反(0变1,1变0)
func bitwiseNOT() {x := uint8(0b00001111)  // 15result := ^x  // 0b11110000 = 240fmt.Printf("^%08b = %08b\n", x, result)// 输出: ^00001111 = 11110000// 注意:Go中^既是一元也是二元运算符// 一元:位取反// 二元:异或// 应用场景:// 1. 创建掩码的反码mask := 0b00001111invertedMask := ^mask  // 11110000// 2. 求补码(有符号数)// Go中整数以补码形式存储// 3. 清除特定位(与&^配合)flags := 0b1111keepMask := 0b1100  // 保留高2位cleared := flags & ^keepMask  // 清除低2位
}

📊 组合使用示例

示例1:权限系统

// 使用位运算实现权限控制
const (Read   = 1 << iota  // 0001Write               // 0010Execute             // 0100Delete              // 1000
)type User struct {permissions byte
}func (u *User) addPermission(perm byte) {u.permissions |= perm  // 设置位
}func (u *User) removePermission(perm byte) {u.permissions &^= perm  // 清除位
}func (u *User) hasPermission(perm byte) bool {return u.permissions & perm != 0  // 检查位
}func (u *User) togglePermission(perm byte) {u.permissions ^= perm  // 切换位
}

示例2:位标志操作

func bitFlagOperations() {// 初始化标志var flags uint8 = 0// 设置标志flags |= 0b00000001  // 设置第0位flags |= 0b00000100  // 设置第2位fmt.Printf("设置后: %08b\n", flags)  // 00000101// 检查标志if flags & 0b00000100 != 0 {fmt.Println("第2位已设置")}// 清除标志flags &^= 0b00000001  // 清除第0位fmt.Printf("清除后: %08b\n", flags)  // 00000100// 切换标志flags ^= 0b00001000  // 切换第3位fmt.Printf("切换后: %08b\n", flags)  // 00001100// 获取所有设置的位for i := 0; i < 8; i++ {if flags & (1 << i) != 0 {fmt.Printf("位 %d 已设置\n", i)}}
}

示例3:颜色操作(RGBA)

func colorOperations() {// 32位ARGB颜色:A R G B 各8位color := uint32(0xFF336699)  // Alpha=FF, R=33, G=66, B=99// 提取各分量alpha := (color >> 24) & 0xFFred := (color >> 16) & 0xFFgreen := (color >> 8) & 0xFFblue := color & 0xFFfmt.Printf("A=%02X R=%02X G=%02X B=%02X\n", alpha, red, green, blue)// 修改分量// 将红色分量改为0xAAcolor = (color & 0xFF00FFFF) | (0xAA << 16)// 降低亮度(所有分量减半)color = ((color >> 1) & 0x7F7F7F7F) | (alpha << 24)// 创建新颜色newColor := (0xFF << 24) | (0x12 << 16) | (0x34 << 8) | 0x56
}

🎯 优先级和结合性

优先级 运算符 说明
1 ^(一元) 位取反
2 << >> 移位
3 & 位与
4 ^(二元) 位异或
5 | 位或
6 &^ 位清除

使用括号明确优先级

// 容易混淆的表达式
result1 := a & b ^ c   // (a & b) ^ c
result2 := a & (b ^ c) // 不同的结果!// 总是使用括号使意图明确
clear := (a & ^b)      // 与 a &^ b 相同

💡 实用技巧

1. 判断奇偶性

func isEven(n int) bool {return n & 1 == 0  // 比 n%2 == 0 更快
}

2. 交换两个变量

func swap(a, b int) (int, int) {a ^= bb ^= aa ^= breturn a, b  // 不用临时变量
}

3. 判断是否是2的幂

func isPowerOfTwo(n int) bool {return n > 0 && (n & (n-1)) == 0
}

4. 获取最低位的1

func lowestSetBit(n int) int {return n & -n  // 如:1010 & 0110 = 0010
}

5. 统计1的个数(Brian Kernighan算法)

func countOnes(n uint) int {count := 0for n != 0 {n &= n - 1  // 清除最低位的1count++}return count
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1173667.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go中 巧妙解除 同主版本多子版本共存

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

基于SpringAI的在线考试系统-考试系统DDD(领域驱动设计)实现步骤详解(2)

✅ 在线考试系统「DDD领域驱动设计」完整落地步骤&#xff08;通俗易懂图文&#xff09; 设计顺序&#xff1a;用户自然语言需求 → DDD领域建模 → 数据库表结构设计 → DDD代码落地开发&#xff0c;就是行业通用的最优/标准最佳实践&#xff0c;没有之一。 所有大厂做中大型业…

基于SpringAI的在线考试系统-DDD(领域驱动设计)核心概念及落地架构全总结 (2)

DDD&#xff08;领域驱动设计&#xff09;核心概念及落地架构全总结 本文基于订单管理场景&#xff0c;结合实操理解&#xff0c;全面梳理DDD&#xff08;领域驱动设计&#xff09;的核心概念、层级关系、落地架构方案&#xff0c;以及与分布式、微服务、服务网格、Serverless的…

为什么论文越改越“规范”,反而越容易被判 AI?

很多同学都有过这种经历&#xff1a;论文是自己写的改了很多遍语句越来越通顺用词越来越学术结果—— AI 率不降反升&#xff0c;甚至直接被判高风险。你会很崩溃地问一句&#xff1a;“我不是在认真改吗&#xff1f; 为什么越改越不安全&#xff1f;”问题&#xff0c;恰恰就出…

2026 英语雅思留学培训机构口碑排名推荐,权威深度测评靠谱提分方案​ - 老周说教育

雅思备考最怕 “努力无效”!无数考生在听力考场上被同义替换绕得晕头转向,面对写作题目时逻辑支离破碎、无从下笔,口语考试中又因临场紧张而频频卡顿。而在选择雅思培训机构的过程中,更是难上加难 —— 市场上优质…

京东m端 验证码分析

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;部分Python代码cookies.update(dict(res…

基于多目标遗传算法的分布式电源选址定容探索

基于多目标遗传算法的分布式电源选址定容研究 关键词&#xff1a;分布式电源 选址定容 多目标遗传算法 参考文档&#xff1a;《店主自写文档》基本复现&#xff1b; 仿真软件&#xff1a;MATLAB 研究内容&#xff1a;代码主要做的是基于多目标遗传算法的分布式电源选址定容…

IDEA配置本地Maven软件

教程:https://blog.csdn.net/qq_42057154/article/details/106114515 参照这个

智能通信网关在城市地下管廊的应用

核心痛点&#xff1a;管廊内部环境复杂&#xff0c;有毒有害气体、火灾、积水等安全隐患难以及时发现&#xff1b;管线状态未知&#xff0c;泄漏、破损等故障定位困难&#xff1b;人工巡检风险高、频率低、效率差&#xff1b;各管线单位独立监控&#xff0c;缺乏统一协调指挥。…

工业组态平台构建可视化设备监控运维管理系统

设备故障预警不及时、运维响应慢、维修记录不闭环是很多制造企业面临的痛点。数之能基于工业组态云平台&#xff0c;构建了一套完整的远程监控、告警、控制与运维管理系统。系统通过实时采集设备数据&#xff0c;结合预设的报警规则与运维流程实现故障告警到工单运维的全流程在…

探寻浙江好砌墙石:2026年值得关注的厂家,脚踏石/冰裂纹/地铺石/碎拼石/文化石/砌墙石/贴墙石,砌墙石品牌口碑推荐 - 品牌推荐师

评测背景 近年来,浙江地区建筑装饰行业对高品质砌墙石的需求持续增长,消费者对材料性能、环保标准及服务能力的关注度显著提升。为客观评估市场主流产品,本评测机构基于建材行业技术标准与用户实际需求,选取河北仁…

三菱PLC玩转压力控制:压背光板项目实战揭秘

三菱Q系列PLC程序案例 本案例是压背光板并保持恒定压力&#xff0c;通过位置模式以及转矩模式切换来快速实现压力保持&#xff0c;转矩模式时通过PID计算来自动调节压力。 本案例采用三菱Q系列PLC以及QD77MS运动模块以及三菱J4-B型总线伺服系统。 三菱Q系列ST、结构化编程、QD7…

近五年考试周期最短的证书,持证人薪资水平曝光

在学历内卷加剧、行业技术迭代加速的当下&#xff0c;职场人对 “高效增值” 的需求日益凸显&#xff0c;“长期备考 高门槛考证” 的传统模式逐渐失去吸引力。近五年&#xff0c;考试周期≤6 个月的短周期证书凭借适配行业需求、投入产出比突出的特点&#xff0c;成为职场人提…

【设计模式】迭代器模式(Iterator)详解

文章目录1. 引言&#xff1a;为什么我们每天都在用迭代器&#xff1f;2. 什么是迭代器模式GoF 定义3. 迭代器模式的核心思想4. 迭代器模式的结构5. 示例&#xff1a;自定义集合 迭代器5.1 迭代器接口5.2 聚合接口5.3 具体聚合类5.4 客户端使用6. 迭代器模式的优点7. 迭代器模式…

【潮流计算】分布式电源接入电力系统的潮流计算与分析【含Matlab源码 14972期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;Matlab领域博客之家&#x1f49e;&…

包装机品牌新排行:2026年哪些品牌值得选择?摇臂缠膜机/自动缠绕机/托盘打包机/自走缠绕包装机,包装机供应商推荐 - 品牌推荐师

随着全球制造业向智能化、柔性化加速转型,包装机作为生产环节的关键设备,其技术迭代与市场需求呈现双向驱动。据行业数据显示,2025年全球包装机械市场规模突破680亿美元,其中自动化、模块化设备占比超65%,食品、医…

Shell Daily 2026-01-17: 任务挂起 (Job Control)

Shell Daily 2026-01-17: 任务挂起 (Job Control) 作为一名 Linux 用户,你是否经历过这种尴尬:正在 Vim 里编辑复杂的配置文件,突然需要去查看一下网络接口的 IP,或者去另一个目录确认文件名。 此时你会怎么做?保…

2026气动蝶阀怎么挑?行业实力厂家来助阵,电液动盲板阀/电动阀门/水利阀门/气动调节阀/不锈钢阀门,蝶阀销售厂家如何选 - 品牌推荐师

在工业自动化与绿色制造加速融合的背景下,气动蝶阀作为流体控制领域的核心设备,其性能稳定性、智能化水平及适配场景的广度,直接影响着能源、化工、冶金等行业的生产效率与安全。据统计,2025年全球气动蝶阀市场规模…

2026年最新有名的金蝶ERP产品价格推荐,协同云/好会计/用友 T3/好业财/好生意/财务云,金蝶ERP企业哪个好 - 品牌推荐师

在数字化转型浪潮持续深入的当下,企业资源计划(ERP)系统已成为企业提升运营效率、实现精细化管理不可或缺的核心工具。面对市场上琳琅满目的ERP产品,如何选择一款既符合自身业务需求,又具备良好性价比与持续服务能…