计算二进制数中1的个数是计算机科学中的经典问题,以下是几种高效的方法及实现方式:
一、逐位统计法(最基础方法)
通过逐位与1比较并右移实现计数,时间复杂度与最高位1的位置相关(最多32次循环)。
示例代码(C语言):
```c
int BitCount(unsigned int n) {
int count = 0;
while (n > 0) {
if ((n & 1) == 1) count++;
n >>= 1;
}
return count;
}
```
二、快速法(按1的个数计数)
通过不断消除最低位的1来减少循环次数,时间复杂度与1的个数k相关。
示例代码(C语言):
```c
int NumberOf1(unsigned int n) {
int count = 0;
while (n != 0) {
n = n & (n - 1); // 将最低位的1置为0
count++;
}
return count;
}
```
三、分治法(按位组计算)
利用二进制位组的规律,分块计算1的个数。例如,每4位一组,根据模式统计1的分布。
示例代码(Python):
```python
def count_ones(n):
count = 0
for i in range(32): 32位整数
mask = 1 << i
group = (n >> i) & mask
count += group & 1
return count
```
四、位操作优化技巧
查表法:
预计算0-255的1的个数,通过拆分数字减少计算量。
负数处理:
使用补码表示时,需注意符号位。
五、其他场景扩展
若需计算从1到n所有数字的二进制1的总数,可利用位权值规律累加。
总结
效率优先:快速法(按1的个数计数)性能最佳,适用于1数量较多的情况。
场景适配:逐位统计法简单直观,适合教学或位数较少的场景。
语言特性:Python等高级语言提供内置函数(如`bin()`)简化操作,但性能较低。
根据具体需求选择方法,例如:
统计单个数:优先使用快速法或查表法;
统计范围:需结合数学规律优化(如分治法)。