二进制的一些小技巧
^
- 找到汉明距离(两个数对应二进制位不同的数目);
汉明距离是使用在数据传输差错控制编码里。
(num - 1) & num
- 用于清除 num 最右边的 1;
Brian Kernighan(布莱恩 柯林汉) 算法是一种用于统计一个二进制数中 1 的个数的算法,通过不断将数字中的最低位的 1 变成 0 的方式统计二进制数中的 1 的个数。
num & 1
- 用于判断 num 的二进制表示中最右边的位是否为 1;
num >> 1
- 用于将 num 的二进制表示向右移动一位;
(1 << n) - 1
- 生成一个长度为 n 并且全为 1 的二进制数;
用于使用异或快速将一个数进行取反, 如果直接取反一个数的话得到的是负数。
(1 << k) & n
k 从 30 开始递减。
- 用于比较一个二进制数的高位是否为 1。
快速构造小于 num 的 2 的幂次方的数组
const num = 15; // 最多为 2^3,也就是 8
let x = num;
const ans = [];
while (x > 0) {
ans.push(lowbit(x));
x -= lowbit(x);
}
function lowbit(x) {
return x & -x;
}
异或前缀和
一个子数组的异或和(i, j)= 异或前缀和(j + 1)^ 异或前缀和(i)
异或前缀和数组比原数组长度多 1,多了一个 0.