多uint32_t输入下生成目标uint32_t:对应位全相同则置1
这个问题用位运算就能高效解决,我来给你拆解清楚:
问题回顾
输入若干个uint32_t类型的数字(每个可视为32位二进制串),需要生成一个新的uint32_t,其中第n位为1当且仅当所有输入数字的第n位取值完全一致(要么全0,要么全1),否则该位为0。
简化4位示例:
输入:0011(十进制3)、0101(十进制5)、0110(十进制6)
输出:1000(十进制8)
原因:所有输入的最高位都是0,完全相同,故输出该位为1;其余位存在不同取值,设为0。
核心思路:利用位运算特性
我们可以通过按位与和按位或两个操作快速定位所有输入位相同的位置:
- 按位与(
&)的结果中,某一位为1 → 所有输入的该位都是1; - 按位或(
|)的结果中,某一位为0 → 所有输入的该位都是0;
把这两类位合并(按位或),就得到了所有输入位相同的位置为1的结果。
代码实现(C语言)
#include <stdint.h> #include <stddef.h> uint32_t same_bits(uint32_t *inputs, size_t count) { if (count == 0) { // 空输入的边界处理,可根据需求调整返回值 return 0; } uint32_t all_and = inputs[0]; uint32_t all_or = inputs[0]; for (size_t i = 1; i < count; i++) { all_and &= inputs[i]; all_or |= inputs[i]; } // 合并全1位(all_and)和全0位(~all_or 截断为32位) return all_and | (~all_or & 0xFFFFFFFF); }
代码解释
- 初始化:将
all_and和all_or初始化为第一个输入值,作为后续运算的基准; - 遍历更新:依次对所有输入执行按位与和按位或,逐步缩小
all_and(仅保留所有输入都为1的位)、扩大all_or(保留至少一个输入为1的位); - 结果计算:
~all_or & 0xFFFFFFFF会把所有输入都为0的位设为1(截断为32位避免符号扩展问题),再和all_and按位或,就得到了所有输入位相同的位置为1的最终结果。
验证示例
拿开头的4位例子来说:
- 输入3(0011)、5(0101)、6(0110)
all_and= 3 & 5 & 6 = 0000all_or= 3 | 5 | 6 = 0111~all_or(4位)= 1000,和all_and按位或后得到1000,完全符合预期。
内容的提问来源于stack exchange,提问作者johny
相关产品推荐
相关产品推荐

