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(表示字符已经出现过)。
- 如果发现重复的字符,则返回false;
- 否则,将该字符对应的位设置为1,并继续处理字符串中的下一个字符。
- 如果所有字符都被成功处理,没有发现重复,则返回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及其右边区域全部取反 :
相关题目
8.位运算的优先级
能加括号就加括号,先算谁就先加括号,就不需要记优先级 !!!!
9. 异或(^)运算的运算律
简单介绍一下第三点的使用场景:
相关题目