阴暗的C/C++宏定义

#define OCB(c) (c&1)|(c&2)<<2|(c&4)<<4|(c&8)<<6|(c&16)<<8|\
(c&32)<<10|(c&64)<<12|(c&128)<<14

 

这段代码定义了一个名为 OCB 的宏,用于对一个 8 位整数 c 进行位重组操作。它将输入字节的每个位提取出来,然后将它们分别左移到新的位置,最终组合成一个 16 位的值。这种位重组在密码学或数据编码中很常见。

宏的具体操作如下:
    • c&1 提取第 0 位,左移 0 位(保持原位)
    • c&2 提取第 1 位,左移 2 位
    • c&4 提取第 2 位,左移 4 位
    • 依此类推,直到提取第 7 位(c&128)并左移 14 位
    • 最后通过按位或 | 将所有结果组合在一起

例如,若输入 c 为二进制 0b10101010,则处理后的二进制结果为:

第0位: 00
第1位: 1 → 1左移2位 → 0b00000100
第2位: 00
第3位: 1 → 1左移6位 → 0b01000000
第4位: 00
第5位: 1 → 1左移10位 → 0b010000000000
第6位: 00
第7位: 1 → 1左移14位 → 0b0100000000000000
-------------------------------------------
组合后: 0b0101010101010100 (0x5554)
注意事项:
    1. 输入 c 应为无符号 8 位整数(0-255)
    2. 结果为 16 位值,可能需要用 uint16_t 类型存储
    3. 宏定义使用了反斜杠 \ 来分行,确保格式正确
    4. 该操作是可逆的,可通过类似的位提取操作恢复原始值

限制幅度值 clamp(钳位)

//初始变量及函数定义
#define _constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt)))
这段代码是 C/C++ 中的宏定义,实体信息如下:

宏定义解析

  • 宏名称:_constrain
  • 功能:实现类似 “限幅”(也叫 “钳位” )的功能,将输入的 amt 值限制在 low 和 high 规定的范围内。
    • 如果 amt 小于 low,返回 low
    • 如果 amt 大于 high,返回 high
    • 如果在 [low, high] 区间内,返回 amt 本身 。
  • 语法细节:利用三元运算符 ?: 实现分支逻辑,通过反斜杠 \ 实现宏定义的换行续写(C/C++ 宏定义换行时需用反斜杠连接)。
简单说,这是一个用于限制数值范围的工具宏,常见于嵌入式编程(如 Arduino 开发)里对传感器数值、变量值做边界约束 。

 

posted @ 2025-06-26 21:55  mcwhirr  阅读(21)  评论(0)    收藏  举报