191. Number of 1 Bits

本文介绍了一个简单的方法来计算一个32位无符号整数中1的个数(汉明重量)。通过一个C++函数实现了该算法,采用位操作的方式逐位检查并累加1的个数,直至原始数字通过右移操作变为0。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 1 class Solution 
 2 {
 3 public:
 4     int hammingWeight(uint32_t n) 
 5     {
 6         int count=0;
 7         while(n)
 8         {
 9             count+=n&1;
10             n>>=1;
11         }
12         return count;
13     }
14 };

把末尾的位摘下来直接累加就行,直到原数字因为右移操作变为0。

转载于:https://www.cnblogs.com/zhuangbijingdeboke/p/9071275.html

<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; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值