目录
常见位运算总结
在开始刷位运算这个类型的题目前,我想先带着大家学习一下一些常见的基础运算操作,我们后面刷题时对题目的处理都是基于这些基本运算。
1. 基础位运算
想必大家对位运算符都是非常熟悉的,在这里,我为大家讲讲我对几个按位操作符的理解
&:有0就是0
| :有1就是1
^ :相同为0,相反为1 (也可以视作为无进位相加)
2. 给一个数n,确定二进制表示中第x位是0还是1
(n >> x) & 1
3. 将一个数n的二进制表示的第x位修改成1
n |=(1 << x)
4. 将一个数n的二进制表示的第x位修改成0
n &= (~(1 << x))(~就是取反)
5. 位图的思想
位图的本质就是个哈希表,我们先前学习过的哈希表在大部分情况下都是数组形式的
使用一个变量的比特位来记录信息,对哈希表的增删查改,就相当于是对比特位的增删查改,这就意味着,我们前面讲到的几种常见的位运算操作都是非常重要的,能帮助我们更好地操作位图
6. 提取一个数n最右侧的1
这个描述听起来有些抽象,我为大家举个例子:
这就是提取最右侧的1
操作方式:n & -n
-n是由n按位取反再+1得到的:
通过这个例子我们发现了:n与-n的关系是,在最右侧的1的左侧,n与-n完全相反;在最右侧的1的右侧,n与-n完全相同。则左侧区域两者&的结果必定为0,右侧区域&的结果不变,于是我们实现了把最右侧1提取出来的操作。
7. 干掉一个数n二进制表示中最右侧的1
n & (n - 1)
众所周知,减法是存在借位的,n - 1的本质就是,将最右侧的1右侧的区域全部取反