1. 二进制中1的个数统计:从基础实现到算法优化
在底层系统开发、嵌入式编程和算法面试中,统计一个整数二进制表示中1的个数是一个经典问题。这个问题看似简单,却涉及到位运算、计算机组成原理以及算法优化等多个核心概念。今天我们就来深入探讨这个问题的各种解法及其背后的原理。
1.1 问题定义与应用场景
我们需要编写一个函数,输入一个整数,返回其二进制表示中1的个数。例如:
- 输入5(二进制101),返回2
- 输入7(二进制111),返回3
- 输入0(二进制0),返回0
这个操作在计算机科学中被称为"population count"或"popcount",在以下场景中有广泛应用:
- 哈希算法中计算汉明距离
- 位图操作和位集合运算
- 密码学中的某些算法
- 图像处理中的像素统计
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础实现方法解析
2.1 移位与按位与的实现
让我们先分析提供的参考代码:
c复制#include<stdio.h>
int NumberOf1(int n) {
int i = 0;
int count = 0;
for (i = 0; i < 32; i++) {
if (((n >> i) & 1) == 1) {
count++;
}
}
return count;
}
int main() {
int n = 0;
scanf("%d", &n);
int ret = NumberOf1(n);
printf("%d\n", ret);
return 0;
}
这个实现采用了最直观的思路:逐位检查。让我们分解其工作原理:
- 初始化计数器count为0
- 循环32次(对应32位整数的32个bit位)
- 每次循环中:
- 将n右移i位,使目标bit位于最低位
- 用按位与操作
& 1提取最低位的值 - 如果结果为1,则计数器加1
- 返回最终的计数值
注意:这里假设int是32位的,这在大多数现代系统上是成立的,但严格来说应该使用
sizeof(int)*8代替硬编码的32。
2.2 时间复杂度与空间复杂度分析
- 时间复杂度
