191 Number of 1 Bits

本文讨论了如何在Java中计算32位无符号数的汉明重量,通过位操作实现,不使用模运算。
/*
 * 32位无符号数最大为2147483647
 * Java中没有无符号类型,所以此题不能用n%2的方法解题

 */

public class Solution {
    // you need to treat n as an unsigned value
    public int hammingWeight(int n) {
int bits = 0;
int t = 0;
while(n!=0){
bits += (n&1);
n = n >>> 1;
}
return bits;
    }
}

<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、付费专栏及课程。

余额充值