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


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


相关推荐
linwq83 分钟前
设计模式学习(二)
java·学习·设计模式
桦说编程34 分钟前
CompletableFuture 超时功能有大坑!使用不当直接生产事故!
java·性能优化·函数式编程·并发编程
@_@哆啦A梦36 分钟前
Redis 基础命令
java·数据库·redis
努力学习java的哈吉米大王1 小时前
数据结构-队列
数据结构
Joyner20181 小时前
python-leetcode-从中序与后序遍历序列构造二叉树
算法·leetcode·职场和发展
因兹菜1 小时前
[LeetCode]day9 203.移除链表元素
算法·leetcode·链表
LNsupermali1 小时前
力扣257. 二叉树的所有路径(遍历思想解决)
算法·leetcode·职场和发展
雾月551 小时前
LeetCode LCR180文件组合
算法·leetcode·职场和发展
萌の鱼1 小时前
leetcode 2080. 区间内查询数字的频率
数据结构·c++·算法·leetcode
Tisfy1 小时前
LeetCode 0541.反转字符串 II:模拟
算法·leetcode·字符串·题解