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


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


相关推荐
SamDeepThinking1 天前
IntelliJ IDEA 中有什么让你相见恨晚的技巧?
java·后端·程序员
SamDeepThinking1 天前
为什么选微服务而不是动态扩容单体
java·后端·架构
风筝在晴天搁浅1 天前
字节 LeetCode CodeTop 912.排序数组
算法·leetcode
Liangwei Lin1 天前
LeetCode 48. 旋转图像
算法
AGV算法笔记1 天前
【具身智能研究进展】RoboBrain 2.5:让机器人真正理解“空间”和“时间”的大脑模型
算法·3d·机器人·具身智能·感知算法
小新同学^O^1 天前
初步了解--> SpringCloud
java·学习·spring·spring cloud
love在水一方1 天前
【InternNav】 工程详细分析
人工智能·算法·机器学习
ch.ju1 天前
Java程序设计(第3版)第二章——函数的递归
java·开发语言
其实防守也摸鱼1 天前
ctfshow--Crypto(crypto1-14)解题步骤
java·开发语言·网络·安全·密码学·ctf·ctfshow
合兴软件@1 天前
合兴软件重磅推出高性能HSM固件 国密算法赋能汽车信息安全新防线
网络·算法·网络安全·汽车·信息与通信