191 & 剑指 Offer 15. 二进制中1的个数

Posted 沧夜2021

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了191 & 剑指 Offer 15. 二进制中1的个数相关的知识,希望对你有一定的参考价值。

来源

主站191题,剑指 Offer 15题

内容

请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。

示例 1:

输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 ‘1’。
示例 2:

输入:00000000000000000000000010000000
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 ‘1’。
示例 3:

输入:11111111111111111111111111111101
输出:31
解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 ‘1’。

提示:

输入必须是长度为 32 的 二进制串 。

解题过程

这题虽然是简单题,但是也很有意思

一开始我的思路是使用to_string转为string类再遍历查找1计算出1的个数。

测试时候,却发现

翻车了

于是去查 to_string - C++ Reference

发现:

string to_string (int val);
string to_string (long val);
string to_string (long long val);
string to_string (unsigned val);
string to_string (unsigned long val);
string to_string (unsigned long long val);
string to_string (float val);
string to_string (double val);
string to_string (long double val);

没有 uint32_t 这个类型。

怪我不看清题意!

怪我不看清题意!

怪我不看清题意!

于是使用 1<<i 这个与原数字逻辑与,这样做的意义是:

1<<i 表示1左移i位,即第i位为1

其与n想与就得到这位是不是1的结果。如果结果为1n的这位为1

class Solution {
public:
    int hammingWeight(uint32_t n) {
        int ans = 0;
        for (int i = 0; i < 32; i++) {
            if (n & (1 << i)) {
                ans++;
            }
        }
        return ans;
    }
};

后面发现力扣官方题解更快的方法:

使用n & (n-1) ,计算结果为把 n 的二进制位中的最低位的 1 变为 0 之后的结果

试想:

n001010 时,n-1001001

两个数相与结果为:

n		001010
&
n-1 	001001
----------------
    	001000

上面的结果刚好把n中最低位的1变成0

于是我们一直做n & (n-1)运算,运算一次,n最低位的1就会变为0

那么运算ans次后,n0时,就是n的二进制有ans1

class Solution {
public:
    int hammingWeight(uint32_t n) {
        int ans = 0;
        while (n) {
            n &= n - 1;
            ans++;
        }
        return ans;
    }
};

总结

本题两个知识点:

  • 1<<i 表示1左移i位,即第i位为1
  • n & (n-1) ,计算结果为把 n 的二进制位中的最低位的 1 变为 0 之后的结果

以上是关于191 & 剑指 Offer 15. 二进制中1的个数的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer--15二进制中1的个数

Leetcode---剑指Offer题15---二进制中1的个数

Leetcode---剑指Offer题15---二进制中1的个数

剑指offer面试题 15. 二进制中 1 的个数

剑指 Offer 15. 二进制中1的个数

LeetCode 剑指Offer 15[位运算] 二进制中1的个数 HERODING的LeetCode之路