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


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


相关推荐
胖咕噜的稞达鸭40 分钟前
算法入门:专题攻克一---双指针(3)有效三角形的个数 查找总价格为目标值的两个商品(剑指offer题目)
算法
毕设源码-朱学姐3 小时前
【开题答辩全过程】以 爱心捐赠网站为例,包含答辩的问题和答案
java·eclipse
尘觉5 小时前
中秋节与 Spring Boot 的思考:一场开箱即用的团圆盛宴
java·spring boot·后端
逻辑留白陈5 小时前
Adaboost进阶:与主流集成算法对比+工业级案例+未来方向
算法
Learn Beyond Limits5 小时前
Mean Normalization|均值归一化
人工智能·神经网络·算法·机器学习·均值算法·ai·吴恩达
天选之女wow6 小时前
【代码随想录算法训练营——Day28】贪心算法——134.加油站、135.分发糖果、860.柠檬水找零、406.根据身高重建队列
算法·leetcode·贪心算法
Gohldg6 小时前
C++算法·贪心例题讲解
c++·数学·算法·贪心算法
Le1Yu6 小时前
2025-10-7学习笔记
java·笔记·学习
popoxf6 小时前
spring容器启动流程(反射视角)
java·后端·spring
远远远远子6 小时前
类与对象 --1
开发语言·c++·算法