位运算:从基础到实战,解锁高效编程的底层密码
1. 什么是位运算位运算Bitwise Operation是直接对整数在内存中的二进制位bit进行操作的一种运算方式。与常规的算术运算加减乘除不同位运算直接操作数据的底层二进制表示因此执行效率极高是编写高性能、低资源消耗代码的利器。在计算机中所有数据最终都以二进制形式存储。位运算让我们能够像操作开关一样精确地控制每一个二进制位0或1从而实现一些巧妙的算法和优化。2. 六大基本位运算符掌握位运算首先要理解以下六个核心运算符2.1 按位与规则两个位都为1时结果才为1否则为0。示例int a 5; // 二进制0101 int b 3; // 二进制0011 int result a b; // 结果0001 (十进制1) // 计算过程 // 0101 (5) // 0011 (3) // ---- // 0001 (1)常见用途判断奇偶(n 1) 0为偶数(n 1) 1为奇数取特定位value mask可以提取mask中为1的位清零特定位value ~mask可以将mask中为1的位清零2.2 按位或|规则两个位中只要有一个为1结果就为1。示例int a 5; // 0101 int b 3; // 0011 int result a | b; // 0111 (十进制7) // 计算过程 // 0101 (5) // | 0011 (3) // ---- // 0111 (7)常见用途设置特定位为1value | mask可以将mask中为1的位设置为1合并标志位多个布尔标志可以用一个整数的不同位表示2.3 按位异或^规则两个位不同时结果为1相同时结果为0。重要特性任何数与0异或等于本身a ^ 0 a任何数与自身异或等于0a ^ a 0满足交换律和结合律a ^ b b ^ a(a ^ b) ^ c a ^ (b ^ c)示例int a 5; // 0101 int b 3; // 0011 int result a ^ b; // 0110 (十进制6) // 计算过程 // 0101 (5) // ^ 0011 (3) // ---- // 0110 (6)常见用途交换两个数a a ^ b; b a ^ b; a a ^ b;找出现奇数次的数在一组数中只有一个数出现奇数次其他都出现偶数次加密解密用同一个密钥异或两次得到原文2.4 按位取反~规则将每一位取反0变11变0。注意在Java等有符号整数语言中取反操作包括符号位。示例int a 5; // 0000 0000 0000 0000 0000 0000 0000 0101 int result ~a; // 1111 1111 1111 1111 1111 1111 1111 1010 (十进制-6) // 这是补码表示实际值为-6常见用途创建掩码~0得到所有位都是1的数-1配合与运算清零特定位2.5 左移规则将二进制位全部向左移动指定位数低位补0。数学意义a n相当于a × 2ⁿ在不溢出的情况下。示例int a 5; // 0101 int result a 2; // 010100 (十进制20) // 相当于 5 × 2² 20常见用途快速乘以2的幂设置标志位1 n创建只有第n位为1的掩码2.6 右移 和 算术右移带符号右移高位补符号位正数补0负数补1。逻辑右移无符号右移高位总是补0。示例int a 8; // 1000 int b -8; // 1111 1111 1111 1111 1111 1111 1111 1000 int r1 a 2; // 0010 (2) 算术右移 int r2 a 2; // 0010 (2) 逻辑右移正数相同 int r3 b 2; // 1111 1111 1111 1111 1111 1111 1111 1110 (-2) int r4 b 2; // 0011 1111 1111 1111 1111 1111 1111 1110 (很大的正数)常见用途快速除以2的幂算术右移提取高位信息无符号处理逻辑右移3. 位运算的实战应用3.1 权限控制系统使用位运算实现简洁高效的权限控制public class PermissionSystem { // 定义权限常量使用2的幂次方 public static final int READ 1 0; // 0001 public static final int WRITE 1 1; // 0010 public static final int DELETE 1 2; // 0100 public static final int ADMIN 1 3; // 1000 private int permissions 0; // 添加权限 public void addPermission(int perm) { permissions | perm; } // 移除权限 public void removePermission(int perm) { permissions ~perm; } // 检查是否有权限 public boolean hasPermission(int perm) { return (permissions perm) ! 0; } // 检查是否只有指定权限没有其他权限 public boolean hasOnlyPermission(int perm) { return permissions perm; } // 切换权限有则移除无则添加 public void togglePermission(int perm) { permissions ^ perm; } }3.2 判断2的幂判断一个正整数是否是2的幂如1, 2, 4, 8, 16...public boolean isPowerOfTwo(int n) { // 2的幂的二进制表示只有一个1 // 例如8 10007 0111 // n (n-1) 会消去最低位的1 return n 0 (n (n - 1)) 0; }3.3 计算二进制中1的个数统计一个整数二进制表示中1的个数汉明重量public int countBits(int n) { int count 0; while (n ! 0) { n (n - 1); // 每次消去最低位的1 count; } return count; } // 或者使用内置方法Java public int countBitsBuiltin(int n) { return Integer.bitCount(n); }3.4 交换两个变量的值不使用临时变量public void swap(int a, int b) { a a ^ b; b a ^ b; // b (a ^ b) ^ b a a a ^ b; // a (a ^ b) ^ a b System.out.println(a a , b b); }3.5 找唯一出现一次的数字LeetCode经典题目给定一个非空整数数组除了某个元素只出现一次以外其余每个元素均出现两次。找出那个只出现了一次的元素。public int singleNumber(int[] nums) { int result 0; for (int num : nums) { result ^ num; // 利用 a ^ a 0 的特性 } return result; }4. 位运算的性能优势位运算之所以高效主要有以下几个原因硬件级支持CPU有专门的位运算指令执行速度极快内存访问少一次操作处理多个位减少内存访问次数无分支预测避免if-else等分支语句减少分支预测失败的开销并行处理可以同时对多个位进行操作性能对比示例// 传统方法判断奇偶 boolean isEven1(int n) { return n % 2 0; // 涉及除法运算 } // 位运算判断奇偶 boolean isEven2(int n) { return (n 1) 0; // 只需一次与运算 } // 测试表明位运算版本通常快2-5倍5. 注意事项与最佳实践5.1 优先级问题位运算符的优先级通常低于比较运算符使用时建议加括号// 错误先计算 1 1再与a进行与运算 if (a 1 1) { ... } // 正确明确优先级 if ((a 1) 1) { ... }5.2 符号扩展右移操作时要注意符号扩展问题特别是处理负数时byte b -1; // 11111111 int i b 4; // 算术右移11111111 11111111 11111111 11111111 (-1) int j b 4; // 逻辑右移00001111 11111111 11111111 11111111 (很大的正数)5.3 可读性与维护性虽然位运算高效但可读性较差。建议为复杂的位运算添加详细注释使用有意义的常量名代替魔数考虑使用枚举或常量类管理标志位在性能关键路径使用位运算其他情况优先考虑可读性5.4 平台兼容性不同语言、不同平台对位运算的实现可能有细微差异Java中整数固定为32位移位超过31位会取模C/C中移位超过位数是未定义行为Python整数无固定位数移位不会溢出6. 总结位运算作为编程中的屠龙技虽然日常开发中使用频率不高但在以下场景中不可或缺性能优化加密算法、压缩算法、图形处理系统编程操作系统内核、设备驱动、网络协议算法竞赛状态压缩、位掩码、快速幂嵌入式开发寄存器操作、硬件控制掌握位运算不仅能写出更高效的代码更能深入理解计算机底层的工作原理。建议从简单的应用开始练习逐步掌握这种强大的编程工具。学习建议理解二进制、原码、反码、补码的概念手动计算几个位运算的例子加深理解尝试用位运算解决LeetCode上的相关题目在实际项目中寻找可以使用位运算优化的场景

相关新闻

《MySQL 必知必会》核心实战技能评测大纲

《MySQL 必知必会》核心实战技能评测大纲

① 账号权限体系与安全基线参数解析 在数据库运维的实战中,安全永远是第一道防线。很多初学者容易犯的一个错误就是长期使用 root 账号进行日常开发或查询操作,这无异于将大门钥匙挂在门把手上。MySQL 的安全基石在于“最小权限原则”:用户只能拥有完成其工作所必需的最低限…

2026/10/13 2:10:36 阅读更多 →
【YOLO改进实验】探究“CA注意力机制”在YOLOv8n中的最佳嵌入位置:珊瑚礁白化检测实验

【YOLO改进实验】探究“CA注意力机制”在YOLOv8n中的最佳嵌入位置:珊瑚礁白化检测实验

一、前言 为提升水下珊瑚礁(白化/死亡/健康)检测精度,本实验在YOLOv8n网络中引入CA注意力机制。通过将CA(Coordinate Attention)模块嵌入不同位置(骨干网浅、中、深层及颈部),对比分…

2026/10/9 2:57:09 阅读更多 →
如何用独立截图工具将工作效率提升3倍:从信息捕获到智能处理的完整解决方案

如何用独立截图工具将工作效率提升3倍:从信息捕获到智能处理的完整解决方案

如何用独立截图工具将工作效率提升3倍:从信息捕获到智能处理的完整解决方案 【免费下载链接】QQScreenShot 电脑QQ截图工具提取版,支持文字提取、图片识别、截长图、qq录屏。默认截图文件名为ScreenShot日期 项目地址: https://gitcode.com/gh_mirrors/qq/QQScree…

2026/10/12 10:09:32 阅读更多 →

最新新闻

【STM32C5教程】(4)GPIO 外部中断实验

【STM32C5教程】(4)GPIO 外部中断实验

欢迎关注 youcansxidian【嵌入式软件AI编程】专栏 【STM32C5教程】(1)STM32C5系列介绍 【STM32C5教程】(2)STM32CubeMX2 安装与STM32C5闪灯 【STM32C5教程】(3)GPIO 按键输入实验 【STM32C5教程】&#xff…

2026/10/13 3:22:49 阅读更多 →
Datawhale计算机中的数学#MCS #Mathematics #Maths #Yibo #翊博 #翊博在这里 #菲尔兹奖 #yibohere

Datawhale计算机中的数学#MCS #Mathematics #Maths #Yibo #翊博 #翊博在这里 #菲尔兹奖 #yibohere

计算机中的数学 📚 大学数学与工业实践深度解析(Part 1 结课篇)作业: 课后一定要去查阅今年的原论文,并尝试复现。 看不懂原论文,复现不了,对不起。一、 概率论与数理统计(从代码到理…

2026/10/13 3:22:49 阅读更多 →
网络IO与IO多路复用基础(上)

网络IO与IO多路复用基础(上)

网络IO与IO多路复用基础(上)网络IO 作用 : 解决数据的发送与接受总目标 : 实现一个TCPserver有多个client连接并发的传输信息 phase 1 一个server连接一个client 用到的工具 : 基础语法 实现一个简单server// 创建 net IOint sockfd socket(AF_INET, SOCK_STREAM, 0);// 服务器…

2026/10/13 3:22:49 阅读更多 →
langgraph4j原理源码分析图 II图编译

langgraph4j原理源码分析图 II图编译

​​​ 简介 langgraph4j是java技术栈ai agent框架,深入掌握其源码与原理,指导agent的开发,重构/改造框架,增加特性,快速定位和修复bug,发布私有版本 系列内容: > 架构,包括逻辑…

2026/10/13 3:22:49 阅读更多 →
2026-10-12:处理所有元素的成本。用go语言,给定一个整数序列 nums 和一个固定整数 k。你一开始拥有 k 点资源,需要按照从左到右的顺序逐个处理 nums 中的元素。处理某个元素时,会消

2026-10-12:处理所有元素的成本。用go语言,给定一个整数序列 nums 和一个固定整数 k。你一开始拥有 k 点资源,需要按照从左到右的顺序逐个处理 nums 中的元素。处理某个元素时,会消

2026-10-12:处理所有元素的成本。用go语言,给定一个整数序列 nums 和一个固定整数 k。你一开始拥有 k 点资源,需要按照从左到右的顺序逐个处理 nums 中的元素。处理某个元素时,会消耗等于该元素数值的资源。 如果在处理当前元素前…

2026/10/13 3:22:49 阅读更多 →
股债汇金四杀:买得分散,为什么还会一起亏?

股债汇金四杀:买得分散,为什么还会一起亏?

**分散买了股票、债券、美元和黄金,不等于分散了“急着用钱”的风险。**市场平静时,它们讲的是不同故事;资金紧张时,它们可能面对同一个问题:持有人必须把资产变成现金。 最近“股债汇金四杀”的说法很吓人。但对一个…

2026/10/13 3:21:48 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →