C语言实现uint32位遍历foreach宏:修复迭代异常及业务适配
位遍历宏实现修复方案
需求说明
现有32个单bit位的uint32常量,统称为Class List,定义示例如下:
#define CLASS_A 0x00000001 // 0001 #define CLASS_B 0x00000002 #define CLASS_C 0x00000004 // 0100 #define CLASS_D 0x00000008 #define CLASS_E 0x00000010 #define CLASS_F 0x00000020 // 剩余常量依次类推,每个占1个独立bit位
业务中需要对任意输入的uint32数值,检测其包含Class List中的哪些常量,匹配后执行对应处理逻辑。为了复用代码,需要封装类似json_object_foreach()的遍历宏foreach_bit,入参为原始uint32数值、起始位序、当前位对应的数值。
原有代码核心问题
- 遍历宏逻辑错误:for循环终止条件误设为当前位值非0,遇到未置位的bit直接中断遍历,无法完成0~31位全量检测
- 宏参数对应错误:宏定义内部混用自定义变量和入参的位序变量,导致位序更新失效
- 位运算逻辑冗余:手动循环计算位值效率低,且移位未使用无符号常量存在溢出风险
- 主函数逻辑错误:所有条件判断误用赋值运算符
=而非比较运算符==,且常量匹配对应关系错误 - 宏定义拼写错误:原有
#deifne CLASS_D拼写错误,应为#define CLASS_D
修复后完整代码
#include <stdio.h> #include <stdint.h> // 获取第k位对应的位值,位未置位则返回0 uint32_t get_value_of_kth_bit(uint32_t original_number, int bit_position) { // 位序合法性校验,避免越界移位 if (bit_position < 0 || bit_position >= 32) { return 0; } return original_number & (1U << bit_position); } /** * 位遍历宏:遍历original_number的所有32位,仅当对应位置1时进入循环体 * @param original_number 待检测的原始uint32数值 * @param bit_position 遍历用的位序变量,遍历过程中会自动更新为当前匹配位的序号 * @param current_bit_value 存储当前位对应数值的变量,仅当位置1时为非0 */ #define foreach_bit(original_number, bit_position, current_bit_value) \ for (bit_position = 0; \ bit_position < 32; \ bit_position++) \ if ((current_bit_value = get_value_of_kth_bit(original_number, bit_position)) != 0) // Class List定义 #define CLASS_A 0x00000001 // bit0 #define CLASS_B 0x00000002 // bit1 #define CLASS_C 0x00000010 // bit4 #define CLASS_D 0x00000400 // bit10 int main() { uint32_t num = CLASS_A | CLASS_C; // 二进制00010001,对应十进制17 uint32_t current_bit = 0; uint32_t current_bit_value = 0; foreach_bit(num, current_bit, current_bit_value) { printf("当前检测位序:%u,对应位值:0x%x\n", current_bit, current_bit_value); if (current_bit_value == CLASS_A) { printf("Found class_a bit\n"); } else if (current_bit_value == CLASS_B) { printf("Found class_b bit\n"); } else if (current_bit_value == CLASS_C) { printf("Found class_c bit\n"); } else if (current_bit_value == CLASS_D) { printf("Found class_d bit\n"); } } return 0; }
运行效果说明
上述测试代码输入数值为CLASS_A | CLASS_C,运行后会输出:
当前检测位序:0,对应位值:0x1 Found class_a bit 当前检测位序:4,对应位值:0x10 Found class_c bit
可以完整遍历所有32位,且仅对置位的bit执行对应处理逻辑。
内容的提问来源于stack exchange,提问作者DavidKanes
相关产品推荐
相关产品推荐

