You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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数值、起始位序、当前位对应的数值。


原有代码核心问题

  1. 遍历宏逻辑错误:for循环终止条件误设为当前位值非0,遇到未置位的bit直接中断遍历,无法完成0~31位全量检测
  2. 宏参数对应错误:宏定义内部混用自定义变量和入参的位序变量,导致位序更新失效
  3. 位运算逻辑冗余:手动循环计算位值效率低,且移位未使用无符号常量存在溢出风险
  4. 主函数逻辑错误:所有条件判断误用赋值运算符=而非比较运算符==,且常量匹配对应关系错误
  5. 宏定义拼写错误:原有#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 06:15:01