0

0

Go语言中的位运算技巧解析 Golang高效位操作实战指南

P粉602998670

P粉602998670

发布时间:2026-03-01 14:17:02

|

317人浏览过

|

来源于php中文网

原创

go中位运算符&、|、^、>>需严格类型匹配,&提取标志位,|组合标志,^切换标志,>>建议仅用于无符号类型;const iota定义标志时需显式指定类型或用1

go语言中的位运算技巧解析 golang高效位操作实战指南

Go 里 & | ^ 到底怎么用才不翻车

位运算不是“炫技”,而是处理标志、协议解析、内存优化时绕不开的底层动作。Go 的运算符行为和 C 类似,但没有隐式类型提升,intuint8 混用会直接报错。

  • &(与)常用于提取标志位:比如 flags & ReadPerm != 0 判断是否含读权限
  • |(或)用于组合多个标志:flags | WritePerm | ExecPerm,注意两边类型必须一致,uint8(1) | uint16(2) 编译失败
  • ^(异或)是开关利器:flags ^= DebugMode 可切换调试位,比条件判断更简洁
  • 右移 >> 在无符号数上是逻辑移位,有符号数(如 int)上是算术移位——但 Go 官方强烈建议只对无符号类型做位移,避免负数行为差异

const iota 定义标志位时为什么老出错

很多人照抄示例写 const ( A = 1 ,结果发现 <code>A|B|C 算出来不对,或者传给 syscall 时被截断。根本原因是没控制底层类型和位宽。

  • 显式指定类型,比如 const ( Read = 1 ,否则默认是 <code>int,在 32 位系统上可能只有 31 位可用
  • 如果要支持 64 位标志,直接用 uint64const ( FlagA uint64 = 1
  • 别依赖 iota 自动递增来表示“第几个”,位标志必须是 2 的幂;const ( A; B ) 这种写法会让 B == 1,不是 2,极易埋雷

bits.OnesCount64() 这类函数为啥比手写循环快得多

Go 标准库的 math/bits 包里一堆 OnesCountTrailingZeros 函数,它们不是纯 Go 实现——在支持 POPCNT 指令的 CPU 上,会直接编译成单条硬件指令,速度差一个数量级。

Booltool
Booltool

常用AI图片图像处理工具箱

下载
  • 统计一个 uint64 里有几个 1,用 bits.OnesCount64(x),别写 for x != 0 { c++; x &= x-1 }
  • 判断是否为 2 的幂:用 x != 0 && x&(x-1) == 0 是经典写法,但可读性差;若只是校验,bits.OnesCount64(x) == 1 更直白(性能略低但通常可接受)
  • 注意函数名后缀必须匹配类型:OnesCount32 输入 uint32,传 uint64 会编译失败,不是自动转换

从网络字节流里解析 bitfield 时容易漏掉的细节

比如解析 TCP flag 字段、自定义二进制协议里的紧凑标志组,常见做法是先读一个 byte,再用位运算拆解。问题往往出在“顺序”和“掩码范围”上。

立即学习go语言免费学习笔记(深入)”;

  • TCP flags 是大端序,bit 0 是最低位(CWR),bit 7 是最高位(FIN);所以取 FIN 要用 b & 0x01,而不是 b & 0x80 —— 取决于你按文档定义的 bit 编号方向
  • 掩码别手写十六进制:用 1 更安全,比如第 3 位(从 0 开始)就写 <code>1 ,而不是 <code>0x08,减少换算错误
  • 读到的原始字节是 uint8,但若后续要做多字节拼接(如 3-bit + 5-bit 字段),记得先转成足够宽的类型再移位,避免截断:uint16(b1)

位运算本身很简单,难的是和协议约定、类型宽度、CPU 架构、编译器优化这些隐性层对齐。少一个类型声明,或错一位掩码,调试时可能花半天才意识到是位序理解反了。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

207

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

242

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

352

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

214

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

407

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

428

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

200

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

1212

2025.06.17

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

24

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 5.7万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号