这部分其实较为简单,记住常见的操作即可。题目强记即可。
Brian Kernighan 算法
解释:https://www.cnblogs.com/jerryfish/p/15307637.html
338. 比特位计数
递归对一个数使用 n & (n - 1),消除它右边的0,直到为0停止。
var countBits = function(n) {const ans = new Array(n + 1).fill(0);for (let i = 0; i <= n; i++) {ans[i] = getOneCount(i);}function getOneCount(num) {let count = 0;while (num > 0) { // 这个写法太棒了,importantnum &= num - 1;count++;}// 下面写法就很乱:// let num = i;// while (num & (num - 1)) {// count++; // 满足条件才加1// num = num & (num - 1);// }return count;}return ans;};
231. 2 的幂
var isPowerOfTwo = function(n) {if (n <= 0) {return false;}// 2.计算n 里 1 的个数// let count = 0;// while (n > 0) {// n = n & (n - 1);// count++// }// if (count === 1) {// return true;// }// return false;// 2.更直接return (n & (n - 1)) === 0;};
461. 汉明距离
还是数1 的个数,只是多一步 异或操作。
var hammingDistance = function(x, y) {var s = x ^ y; // 多一步异或let count = 0;while (s > 0) {s &= s - 1;count++;}return count;};
201. 数字范围按位与
这个思路不好理解:按位与呢,只会让数字下降。
var rangeBitwiseAnd = function(left, right) {while (left < right) {right &= right - 1;}return right;};
