常见位运算总结:
1. 基础位运算
<< 左移
>> 右移
~ 按位取反
& 按位与 口诀: 有0则0
| 按位或 口诀: 有1则1
^ 异或 口诀:相同为0,相异为1 / 无进位相加
2. 位运算的优先级
做题时, 能加括号就加括号, 无需管优先级如何
3. 给一个二进制数n, 确定它的二进制表示中的第x位是0还是1
(n >> x) & 1
解释:
约定:从右往左依次是0,1,2....
假设这个数n为 0110010, 他的第x位, 假设是第2位
想要知道这个数是0还是1, 我们可以把这个数 &1 即可, 如果是0, 那么0&1=1, 如果是1, 那么1&1=1
因为1的二进制数是000000....1, 所以如果想让这个数能和1运算, 需要将这个数右移, 那么观察发现只需要右移x即可到达最后一位
4. 将一个数n的二进制表示的第x位修改成1
n = n | (1 << x) / n |= (1 << x)
解释:
将第x位修改成1, 可以将这一位数 |1 ,因为1|1=1,0|1=1
因为是修改这个数的某一位, 其他位要保持不变, 所以不能将这个数进行右移, 只能将1进行左移x位
5. 将一个数n的二进制表示的第x位修改成0
n = n & (~(1 << x)) / n &= (~(1<<x))
解释:
将第x位修改成0, 可以将这一位数 &0 ,因为1&0 = 0,0&0 = 0
&0 想要其他位保持不变, 就要让其他位为1
因为是修改这个数的某一位, 其他位要保持不变, 所以不能将这个数进行右移, 只能将1进行左移x位,再~, 就得到了只有第x位为0, 其余位为1的数
6. 位图的思想
位图和哈希表类似, 但哈希表是用数组存储, 位图是int类型的32个bit位 来存储
7. 提取一个数(n)二进制表示中最右侧的1
n & (-n)
举例: 假设n = 111100 那么提取完的结果就是 000100 , 其余位都是0
解释:
设n = 111100, 那么-n 负数在计算机中存的是补码, 原码取反+1为补码, 则-n = 000100, 可以观察到, -n, 其实就是将最右侧的1, 左边的区域全部按位取反
此时再&n, 那么1前面的数一定是一个0一个1, 结果为0, 后面0&0还是0, 1&1还是1, 就得到了结果
8. 干掉一个数(n)二进制表示中最右侧的1
n & (n-1)
举例: 假设n = 011100, 那么按照题目要求后的结果就是011000, 把最右侧的1变成0
解释:
假设n = 011100, 先将n-1, 得到011011, 把最右侧的1变成0, 再想办法将后面的1变回0
此时再&n, 那么前面的数都是相同的, &完不变, 0&1 = 0, 后面的全部变成0
9. 异或(^)运算的运算律
1) a^0 = a
2) a^a = 0(消消乐)
3) a^b^c = a^(b^c)
一. 面试题, 判断字符是否唯一
答案
二. 丢失的数字
答案
三. 两整数之和
答案
四. 只出现一次的数字II
答案
五. 面试题 消失的两个数字
答案