🌟《奇偶校验大冒险》
🎯 一、故事背景
1、在“数据王国”里,所有信息都会变成二进制传输:
例如:数字 5 → 1012、👑国王布置了任务:
“数据在路上传输后要汇报一共有几个1,而且要知道是奇数个1还是偶数个”
🧠 二、规则讲解
1、📜规则
👉统计所有数字中:
二进制里“1”的总个数2、然后判断:
如果是奇数个1 → 输出校验码 = 1
如果是偶数个1 → 输出校验码 = 0
🌈 三、举个完整例子
1、🎯输入
3 5 3 22、🧩 第一步:变成二进制
| 数字 | 二进制 | 1的个数 |
|---|---|---|
| 5 | 101 | 2 |
| 3 | 11 | 2 |
| 2 | 10 | 1 |
3、🧩 第二步:统计总数
2 + 2 + 1 = 54、🧩 第三步:判断奇偶
5 是奇数 → 输出校验码 = 15、🎯输出
5 1🧠 四、核心算法
1、我们要做三件事:
🥇步骤1:读入数据
cin >> n;🥈步骤2:一个一个处理数字
for(int i = 0; i < n; i++)🥉步骤3:数每个数字里的“1”
👉关键技巧来了!
while(x > 0) { count += (x & 1); x >>= 1; }2、🌟重点解释!
(1)🧩 (x & 1) 是什么?
👉取最后一位!
6 = 110 → 最后一位是0 5 = 101 → 最后一位是1(2)🧩 x >>= 1 是什么?
👉右移一位(去掉最后一位)
101 → 10 → 1 → 0🎯 五、完整代码
#include <iostream> using namespace std; int main() { int n; cin >> n; int total = 0; // 记录所有1的数量 for(int i = 0; i < n; i++) { int x; cin >> x; // 统计x中1的个数 while(x > 0) { total += (x & 1); // 看最后一位是不是1 x >>= 1; // 去掉最后一位 } } // 输出总数 和 校验码 cout << total << " " << (total % 2) << endl; return 0; }🌈 六、再来一个例子
1、🎯输入
4 1 2 4 82、🧠分析
1 → 1 → 1个1 2 → 10 → 1个1 4 → 100 → 1个1 8 → 1000 → 1个13、👉总数:
1+1+1+1 = 4👉校验码:
4 是偶数 → 04、🎯输出
4 0🎉 七、总结
统计所有1, 循环右移算; 最后看奇偶, 校验就完成!🚀 八、进阶小技巧
👉更快的方法(C++内置):
__builtin_popcount(x)👉直接统计1的个数!
🎯 最后一句话总结
👉这题本质就是:
统计所有数字的二进制中“1”的总个数!