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


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


相关推荐
Gyoku Mint3 分钟前
深度学习×第4卷:Pytorch实战——她第一次用张量去拟合你的轨迹
人工智能·pytorch·python·深度学习·神经网络·算法·聚类
葫三生1 小时前
如何评价《论三生原理》在科技界的地位?
人工智能·算法·机器学习·数学建模·量子计算
TT哇1 小时前
【Java EE初阶】计算机是如何⼯作的
java·redis·java-ee
拓端研究室3 小时前
视频讲解:门槛效应模型Threshold Effect分析数字金融指数与消费结构数据
前端·算法
随缘而动,随遇而安5 小时前
第八十八篇 大数据中的递归算法:从俄罗斯套娃到分布式计算的奇妙之旅
大数据·数据结构·算法
IT古董6 小时前
【第二章:机器学习与神经网络概述】03.类算法理论与实践-(3)决策树分类器
神经网络·算法·机器学习
Fireworkitte8 小时前
Apache POI 详解 - Java 操作 Excel/Word/PPT
java·apache·excel
weixin-a153003083168 小时前
【playwright篇】教程(十七)[html元素知识]
java·前端·html
DCTANT8 小时前
【原创】国产化适配-全量迁移MySQL数据到OpenGauss数据库
java·数据库·spring boot·mysql·opengauss
Touper.8 小时前
SpringBoot -- 自动配置原理
java·spring boot·后端