Number of 1 Bits

本文介绍了一种通过C++代码实现的功能,该功能用于计算无符号整数中二进制表示中1的数量,即汉明重量。通过模拟十进制到二进制的转换过程并进行计数,实现了一个简洁高效的解决方案。
Write a function that takes an unsigned integer and returns the number of ’1' bits it has (also known as the Hamming weight).

For example, the 32-bit integer ’11' has binary representation 00000000000000000000000000001011, so the function should return 3.


思路:计算机导论应该都学了如何把一个十进制转化为二进制,这里同理,模拟转换过程然后计数即可。


代码:

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


<think>题目要求计算一个数的二进制表示中1的个数,且不能使用标准库中提供的位计数功能。 我们可以使用循环和位运算来实现。基本思路是:遍历整数的每一位,检查该位是否为1,然后统计总数。 由于整数在C语言中通常为32位(unsigned int),我们可以循环32次,每次检查最低位是否为1,然后右移一位。 注意:使用无符号整数以避免符号位带来的问题。 实现步骤: 1. 初始化一个计数器为0。 2. 循环32次(对于32位无符号整数): a. 检查当前最低位是否为1:使用按位与操作(number & 1),如果结果为1,则计数器加1。 b.number右移一位(number >>= 1)。 3. 返回计数器的值。 但是,题目没有指定整数的位数,但通常我们假设是32位。不过,为了通用性,我们可以使用`sizeof`运算符来动态确定位数。 另一种更高效的方法是使用Brian Kernighan算法:该算法利用`number & (number-1)`可以消除最右边的1的特性,直到number变为0。 这里我们使用Brian Kernighan算法,因为它循环次数与1的个数相同,效率更高。 算法步骤(Brian Kernighan算法): 1. 初始化计数器为0。 2.number不等于0时: number = number & (number - 1); 计数器加1; 3. 返回计数器。 注意:题目要求大括号单独一行。 因此,我们实现如下:</think>### 解决方案 ```c #include <stdio.h> int countBits(unsigned int num) { int count = 0; while (num != 0) { if (num & 1) { count++; } num = num >> 1; } return count; } ``` ### 算法说明 1. **初始化计数器**:`count` 变量用于统计1的个数 2. **循环处理**:使用 `while` 循环逐位处理,直到数值变为0 3. **位检测**:通过 `num & 1` 检测最低位是否为1 - 若为1则计数器加1 4. **右移操作**:`num = num >> 1` 将数值右移一位 5. **返回结果**:循环结束后返回计数器值 ### 关键点 - **不使用标准库**:完全基于位运算实现 - **时间复杂度**:O(n),其中n是整数的位数 - **空间复杂度**:O(1),仅使用固定额外空间 - **处理逻辑**:逐位检测最低位并右移 ### 测试示例 ```c int main() { printf("%d\n", countBits(0)); // 0 (0b0) printf("%d\n", countBits(1)); // 1 (0b1) printf("%d\n", countBits(2)); // 1 (0b10) printf("%d\n", countBits(3)); // 2 (0b11) printf("%d\n", countBits(255)); // 8 (0b11111111) return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值