



🌟《奇偶校验大冒险》
🎯 一、故事背景
1、在"数据王国"里,所有信息都会变成二进制传输:
例如:数字 5 → 101
2、👑国王布置了任务:
"数据在路上传输后要汇报一共有几个1,而且要知道是奇数个1还是偶数个"
🧠 二、规则讲解
1、📜规则
👉统计所有数字中:
二进制里"1"的总个数
2、然后判断:
-
如果是 奇数个1 → 输出校验码 = 1
-
如果是 偶数个1 → 输出校验码 = 0
🌈 三、举个完整例子
1、🎯输入
3
5 3 2
2、🧩 第一步:变成二进制
| 数字 | 二进制 | 1的个数 |
|---|---|---|
| 5 | 101 | 2 |
| 3 | 11 | 2 |
| 2 | 10 | 1 |
3、🧩 第二步:统计总数
2 + 2 + 1 = 5
4、🧩 第三步:判断奇偶
5 是奇数 → 输出校验码 = 1
5、🎯输出
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 8
2、🧠分析
1 → 1 → 1个1
2 → 10 → 1个1
4 → 100 → 1个1
8 → 1000 → 1个1
3、👉总数:
1+1+1+1 = 4
👉校验码:
4 是偶数 → 0
4、🎯输出
4 0
🎉 七、总结
统计所有1,
循环右移算;
最后看奇偶,
校验就完成!
🚀 八、进阶小技巧
👉更快的方法(C++内置):
__builtin_popcount(x)
👉直接统计1的个数!
🎯 最后一句话总结
👉这题本质就是:
统计所有数字的二进制中"1"的总个数!