剑指 offer 数学算法题:二进制中1的个数

题目描述: 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为 汉明重量).

分析:

        循环检查二进制位法,当检查第 i位时,我们可以让 n 与 2^i 进行与运算,当且仅当 n 的第 i 位为 1 时,运算结果不为 0。

        位运算法,n & (n−1)会将n 的最右边的那个1变成0,直到n 等于0,运算次数就等于 n 的二进制位中 1 的个数。

求解:

// 位运算优化法
function hammingWeight1(n: number): number {
  let count = 0;
  while (n !== 0) {
    // n & n - 1的按位与会将最右边的那个 1 变为0
    n = n & (n - 1);
    count = count + 1;
  }
  return count;
}

// 循环检查二进制位法
function hammingWeight2(n: number): number {
  let count = 0;
  for (let i = 0; i < 32; i++) {
    if ((n & (1 << i)) !== 0) {
      // 和 2^i 进行与运算,不等于 0 说明该位置是 1
      count = count + 1;
    }
  }
  return count;
}

你可能感兴趣的:(剑指offer,算法,typescript,leetcode,数据结构,前端)