[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))