一.位运算(最通俗版)
位运算就是直接对整数的二进制位(bit)进行操作,就像你拨动开关一样(0 代表关,1 代表开)。
计算机中所有数据都是以二进制存储的,位运算就是直接操作这些“0 和 1 的开关”。
常用的位运算符(C++ 为例)
1.与(AND)&
规则:两个位都是 1 → 结果才是 1,否则是 0。
例子:
5(二进制 101) & 3(二进制 011) = 1(二进制 001)
因为只有最低位都是 1。
2.或(OR)|
规则:两个位只要有一个是 1 → 结果就是 1。
例子:
5(101) | 3(011) = 7(111)
3.异或(XOR)^
规则:两个位不同 → 结果是 1,相同 → 结果是 0。
例子:
5(101) ^ 3(011) = 6(110)
4.取反(NOT)~
规则:把每一位取反(1 变 0,0 变 1)。
例子:
~5(假设是 8 位整数)
5 = 0000 0101
~5 = 1111 1010(这是补码表示,实际值是 -6)
5.左移<<
规则:把二进制位往左移动,右边补 0。
例子:
5(101) << 1 = 10(1010)
相当于乘以 2。
6.右移>>
规则:把二进制位往右移动,左边补 0(对于无符号数)或补符号位(有符号数)。
例子:
6(110) >> 1 = 3(011)
相当于除以 2 取整。
二.为什么用位运算?
速度快(CPU 直接支持)
节省内存(可以用一个整数的不同位表示多个布尔状态)
某些问题用位运算解决更简洁(比如状态压缩、位掩码)
举个例子(直观理解):
假设你有两个开关控制一盏灯:
开关 A(位1)和开关 B(位2)
灯亮(1)的条件是:A 和 B 都打开(1)→ 这就是
&运算。灯亮的条件是:A 或 B 任意一个打开(1)→ 这就是
|运算。
这就是位运算的“开关”本质 !
1.question:就那么简单吗?这个位运算,如果是,怎么去记忆?
对的,位运算的本质就是这么简单,核心就是对“0 和 1”进行开关一样的操作。
但实际运用时,它之所以看起来复杂,是因为我们把它和数学、逻辑、计算机内存结构结合起来用了。
🔧 如何记忆?
1. 用生活中的比喻记
&(与) →全部同意
就像“两人都要按指纹才能开门”,缺一个都不行。|(或) →有一个就行
就像“两个门铃随便按一个就响”。^(异或) →不一样才行
就像“两个人一个说开一个说关才执行,都说一样就不动”。<<、>>→搬箱子
左移是把箱子往左推,右移是把箱子往右推,空出来的地方补 0。
2. 记住 3 个核心用途
位运算在题目里常用在三个场景:
判断某一位是不是 1
用x & (1 << k)判断第 k 位是否为 1。把某一位变成 1
用x | (1 << k)把第 k 位设为 1。把某一位变成 0
用x & ~(1 << k)把第 k 位清 0。
3. 常用口诀(二进制视角)
& : 有 0 则 0 | : 有 1 则 1 ^ : 相同为 0,不同为 1 ~ : 0 变 1,1 变 0 << : 末尾补 0 >> : 末尾去掉
4. 从题目里记
最好的记忆方法就是动手做题。
比如【二进制中的个数】,就是让你:
输入一个整数 n,输出它的二进制表示里有多少个 1。
你可以:
用
n & 1判断最低位是不是 1。用
n >>= 1把 n 右移一位,相当于扔掉最低位。重复直到 n 变成 0。
这样你就在用&和>>解决实际问题了。
✅ 小结
位运算本身操作简单(就是 0/1 开关)。
记忆时用比喻和核心用途来记。
多动手写代码,遇到问题再回头看运算规则