Leetcode刷题85-191. 位1的个数(C++详细解法!!!)

这篇博客介绍了LeetCode上编号为85的题目——计算无符号整数中1的个数(Hamming weight),并提供了两种C++解决方案:使用bitset和位操作。博主分享了学习位操作的心得体会。
摘要由CSDN通过智能技术生成

Come from : [https://leetcode-cn.com/problems/number-of-1-bits/]

1.Question

Write a function that takes an unsigned integer and return the number of ‘1’ bits it has (also known as the Hamming weight).

Example 1 :

Input: 00000000000000000000000000001011
Output: 3
Explanation: The input binary string 00000000000000000000000000001011 has a total of three '1' bits.

Example 2 :

Input: 00000000000000000000000010000000
Output: 1
Explanation: The input binary string 00000000000000000000000010000000 has a total of one '1' bit.

Example 3 :

Input: 11111111111111111111111111111101
Output: 31
Explanation: The input binary string 11111111111111111111111111111101 has a total of thirty one '1' bits.

Note:

1. Note that in some languages such as Java, there is no unsigned integer type. In this case, the input will be given as signed integer type and should not affect your implementation, as the internal binary representation of the integer is the same whether it is signed or unsigned.
2. In Java, the compiler represents the signed integers using 2's complement notation. Therefore, in Example 3 above the input represents the signed integer -3.

Follow up :

If this function is called many times, how would you optimize it?

2.Answer

easy 类型题目。

AC代码如下:

class Solution {
public:
    int hammingWeight(uint32_t n) {
        int count = 0;
        while(n)
        {
            if(n%2 == 1)
            {
                ++count;
            }
            n /= 2;
        }
        return count;
    }
};

3.大神们的解决方案

方法1:
使用bitset操作,先使用bitset将无符号整数转换成32位二进制数,然后使用bitset中的count操作,计算出二进制中1的个数

class Solution {
public:
    int hammingWeight(uint32_t n) 
    {
        bitset<32> nums(n);
        return nums.count();   //bitset中的函数count:返回二进制中标志位1出现的次数
    }
};

方法2:
使用与操作和右移操作。提示:能使用移位操作,就尽量不使用除法操作~

class Solution
{
public:
    int hammingWeight(uint32_t n)
    {
        int counts = 0;
        while(n)
        {
            if(n&1)//对于n求余,余数是1,则可以使用此种操作来判断,n与1做按位与操作,若余数是1则此操作返回的是真即1,反之则反
                counts++;
            n = n>>1;   //右移一位操作,相当于除以2,能使用移位操作别使用除法操作
        }
        return counts;
    }
};

4.我的收获

Fighting~~~
位操作。。。

2019/5/24 胡云层 于南京 85

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值