0%

位运算

[toc]


Q: 异或^有哪些性质?#

A:
a^a = 0
如果知道abc
那么a = (abc) (bc)


快速只保留末尾的1,其他全置0(例如1010100->0000100)#

b &(-b)


快速剔除末尾的1,其他保留(例如1010100->1010000)#

b &(b-1)
这个操作可以用来快速遍历位数组中的1。

[判断数字是否是2的幂](

如何快速求0000100的1是第几个位置?#

A:
java的Integer.bigCount可以快速计算1的数量
那么减1就变成了0000011
int digit = Integer.bitCount(digitMask - 1); 得到是第2位。



https://leetcode-cn.com/problems/power-of-two/submissions/)


利用不同的位进行分组#

可能的位运算问题,可以考虑“各位的数量"
例如只有1个数字是1个,其他都是3个3个出现,那么可以从每位的1的个数,推断出那个数字(其他肯定要么是1的3倍或者0倍,加起来)
例题:137. 只出现一次的数字 II
上面的状态变化也可以用数字电路的卡诺图进行处理,每次都是一次明确的位状态变更,不需要遍历32次。

也可也i注意利用a^b的结果,找到其中第一个不同的位进行分组(可以用b &(-b))



相关题目#

37. 解数独 用位运算可以节省空间

844. 比较含退格的字符串 - 力扣(LeetCode)

面试题 17.19. 消失的两个数字 - 力扣(LeetCode)