【优选算法 & 位运算】位运算算法入门详解:常见位运算总结


1. 基础位运算



2. 给一个数 n,确定它的二进制表示中的第x位是0还是1




而要确定一个数 n 的二进制表示的第 x 位是0还是1,我们只需要对 x 位上的数按位与&上一个1:

但是我们不能直接拿到 x 位上的数字,因此,我们需要先把 x 位上的数右移>> x位至最低位,再拿最低位&1;


3. 将一个数 n 的二进制表示的第x位修改成1


我们要把第 x 位修改成1,其他位上的二进制数字保持不变,该怎么操作呢?


我们可以使用按位或,对 x 位上的数按位或上一个1,按位或有1就是1,所以最终 x 位就变成1;


在 x 位修改成 1 后,为了让其他位都不变,我们只需要让其他位全部按位或上一个0即可;

在其他位都按位或上一个0 后,新的二进制位只会改变按位或上1 的 x 位


具体操作:


4. 将一个数 n 的二进制表示的第x位修改成0



将一个数 n 的二进制表示的第x位修改成0:

具体操作


5. 位图的思想


位图(Bitmap)是一种数据结构,它使用位(bit)来表示数据,其中每个位的值可以是0或1。

  • 位图通常用于高效地表示和处理大量数据,尤其是当数据集中的元素数量非常大时。
  • 在位图中,每个位对应于数据集中可能存在的一个元素,如果该元素存在,则对应位被设置为1,否则为0。
  • 因为我们需要经常查看某一位存储的是0还是1,并且想把某一位0/1 修改成 1/0,等等这些操作,就会大量运用到上面的 2. 3. 4. 要点的操作;

位图的一个典型应用是在处理大量数据时进行快速查找和去重。

  • 例如,如果要检查一个字符串中的字符是否唯一,可以使用位图来记录每个字符是否出现过。
  • 由于小写字母的数量是固定的(26个),因此可以使用一个整数(32位)来表示所有小写字母的出现情况。每个小写字母对应整数中的一个位,通过位运算可以快速地设置和检查位的状态。

位图被用于解决一个特定的问题:判断一个字符串中的所有字符是否都是唯一的。算法通过一个整数变量bitMap来实现位图,通过位运算来检查和设置字符的出现状态:

  1. 算法将每个字符转换为对应的位索引,并检查该位是否已经被设置为1(表示字符已经出现过)。
  2. 如果发现重复的字符,则返回false;
  3. 否则,将该字符对应的位设置为1,并继续处理字符串中的下一个字符。
  4. 如果所有字符都被成功处理,没有发现重复,则返回true。

这种方法的优点是空间效率高,不需要额外的数据结构,且操作速度快,特别适合处理字符集较小的情况。


6. 提取一个数(n)二进制表示中最右侧的1


仅仅提取最右边的 1 ,其他全为0:

这样的操作称为 lowbit;


具体操作:


n 修改成 -n 操作


我们观察发现,在 n 最右边1后面的所有位,在从 n 转换到 -n 时,这些位都是不变的:

改变的仅仅是最右边1的左边区域,并且左边区域 n 与 -n 严格相反;

所以 - n 的操作的本质,就是将最右边的 1,左边的区域全部变成相反;


此时,再拿算出的 -n ,和原来的 n 进行按位与操作 n & -n ,就实现了提取一个数最右边1的操作:


7.干掉一个数(n)二进制表示中最右侧的1


具体操作



n-1 的本质,就是让最右侧的1及其右边区域全部取反 :



相关题目


191. 位1的个数

338. 比特位计数

461. 汉明距离


8.位运算的优先级


能加括号就加括号,先算谁就先加括号,就不需要记优先级 !!!!


9. 异或(^)运算的运算律



简单介绍一下第三点的使用场景:

相关题目


136.只出现一次的数字

260.只出现一次的数字III


相关推荐
程序员JerrySUN16 分钟前
Jetson Edge AI 实战01:Nano、Xavier、Orin 怎么选?Jetson 硬件选型详解【视频讲解】
java·数据库·redis·安全·mybatis
threerocks26 分钟前
Jev 入门第一课
算法
Joy T1 小时前
Spring AI 2.0 Agent 进阶:Memory、State 与 Context Engineering 常见技术全景
java·人工智能·后端·spring·agent入门·agent state
估值探索者1 小时前
【Python量化系统工程化 #08】关了 SSH 就停?systemd 让脚本开机自启 + 异常自动拉起
java·c++·人工智能·分类·数据挖掘
西柚研究生1234561 小时前
论文分析17:YOLOv11_UAVNet:无人机航拍图像专用目标检测算法
人工智能·python·深度学习·算法·目标检测
天若有情6732 小时前
C++花式魔改!手写头文件复刻Java语法,彻底打破编码思维定式
java·c++·语言做语言·jac++
hetao17338372 小时前
2026-09-17 hetao1733837 的刷题记录
c++·算法
午彦琳3 小时前
2026.9.17
数据结构·算法·leetcode
西峰u3 小时前
Java单例模式|从基础到多线程安全
java·java单例模式
ClinicTech3 小时前
实验室洗瓶机的清洗系统架构与自动化控制解析
java·python