如何用C语言统计32位无符号整数中8位二进制模式的出现次数?
解决方案
核心思路
直接对二进制位进行位运算处理,完全不需要字符串或数组这类聚合类型:
- 用
0xFF(二进制全1的8位掩码)提取32位整数的低8位片段 - 每次将32位整数逻辑右移1位,再提取新的低8位与目标模式对比
- 遍历所有可能的8位窗口(共25个,因为32-8+1=25),统计匹配次数
完整代码
#include <stdio.h> int main() { unsigned int num, pattern; scanf("%u", &num); scanf("%u", &pattern); pattern &= 0xFF; // 确保模式仅保留低8位 unsigned int count = 0; // 遍历所有可能的8位起始位置(0到24) for (int i = 0; i <= 24; i++) { unsigned int current_segment = (num >> i) & 0xFF; if (current_segment == pattern) { count++; } } printf("%u\n", count); return 0; }
关键细节解释
- 逻辑右移:无符号整数的
>>操作是逻辑右移,高位补0,保证每次移位后新的低8位是正确的后续片段 - 掩码截取:
& 0xFF能精准截取当前移位后的低8位,屏蔽高位干扰 - 循环范围:32位整数中,8位模式的起始位可以从第0位到第24位(包含),对应25个连续的8位窗口,覆盖所有可能的匹配位置
- 模式预处理:
pattern &= 0xFF确保即使输入的模式超过8位,也只会保留低8位,符合题目中“8位模式”的要求(题目说无需校验,但这个操作不违反限制,还能避免意外错误)
示例验证
输入32位整数514(二进制00000000 00000000 00000010 00000010)和8位模式2(二进制00000010):
- 当
i=0时,(514 >> 0) & 0xFF结果为2,匹配 - 当
i=16时,(514 >> 16) & 0xFF结果为2,匹配 - 其余位置均不匹配,最终统计次数为
2,与示例一致
内容的提问来源于stack exchange,提问作者Jakov Gl.
相关产品推荐
相关产品推荐

