什么是位运算
程序中的所有数在计算机内存中都是以二进制的形式储存的
位运算:直接对整数在内存中的二进制位进行操作
由于位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快
实战常用的位运算操作
if (x & 1) {
console.log("x 为奇数");
}
// 清除最低为的 1 a100 & a011 = a000
let x = 112 // 111 0000
x = x & (x - 1) // 111 0000 & 110 1111 = 110 0000
console.log(x); // 96
// 得到最低为的 1 a100 & 取反a100 = 100
let x = 112 // 111 0000
x = x & -x // 111 0000 & 001 0000 (取反,+1) = 1 0000
console.log(x); // 16
n & (n - 1) 清除最后一位 1
假设 n n n 的二进制表示: ( a 10...0 ) 2 (a10...0)_2 (a10...0)2
n − 1 n - 1 n−1 的二进制表示: ( a 01...1 ) 2 (a01...1)_2 (a01...1)2
n & ( n − 1 ) n \& (n - 1) n&(n−1) = a 00...00 a00...00 a00...00
n & (-n) 获取最低位的 1
假设 n n n 的二进制表示: ( a 10...0 ) 2 (a10...0)_2 (a10...0)2
− n -n −n 的二进制为 n n n 取反加1 : ( a ˉ 01...1 ) 2 + ( 1 ) 2 = ( a ˉ 10...0 ) 2 (\bar{a}01...1)_2 + (1)_2 = (\bar{a}10...0)_2 (aˉ01...1)2+(1)2=(aˉ10...0)2
n & ( − n ) n \& (-n) n&(−n) = 10...00 10...00 10...00
191. 位1的个数
var hammingWeight = function(n) {
let r = 0
while (n) {
n &= n - 1
r++
}
return r
};
231. 2 的幂
var isPowerOfTwo = function(n) {
return n > 0 && (n & n - 1) == 0
// return n > 0 && (n & -n) == n;
};
338. 比特位计数
var countBits = function(n) {
const res = new Array(n + 1).fill(0)
for (let i = 1; i <= n; i++) {
res[i] = res[i & i - 1] + 1
}
return res
};