高低位互换是对单个整数的二进制位重新排列,如16位数将高8位与低8位交换,32位数则按字节翻转实现大小端转换。

什么是高低位互换
高低位互换不是指交换两个变量,而是对单个整数内部的二进制位进行重新排列。比如一个16位数,前8位叫“高位”,后8位叫“低位”,互换就是把高位挪到低8位、低位挪到高8位。类似地,32位数常需将字节0和字节3对调、字节1和字节2对调,实现大小端(endianness)转换。
16位数的高低字节互换:最简实现
设 x 是一个无符号16位整数(uint16_t),其二进制为 H H H H H H H H L L L L L L L L(H=高位字节,L=低位字节)。只需两步:
- 将高位字节右移8位 → 得到
0 0 0 0 0 0 0 0 H H H H H H H H - 将低位字节左移8位 → 得到
L L L L L L L L 0 0 0 0 0 0 0 0 - 两者按位或(
|)→ 合并为L L L L L L L L H H H H H H H H
代码即:x = (x > 8);
例如 x = 34520(二进制 10000110 11011000),执行后变为 11011000 10000110 = 55430。
32位数的字节序翻转(大端↔小端)
对 uint32_t,需交换4个字节:原顺序为 B0 B1 B2 B3(B0是最高有效字节),目标为 B3 B2 B1 B0。用位运算分四段提取+移位组合:
-
(x & 0xFF000000) >> 24→ 提取B0,移到最低字节位置 -
(x & 0x00FF0000) >> 8→ 提取B1,移到次低字节 (x & 0x0000FF00) → 提取B2,移到次高字节(x & 0x000000FF) → 提取B3,移到最高字节位置- 全部用
|合并
完整表达式:x = ((x > 8) & 0x0000FF00) | ((x >> 24) & 0x000000FF);
等价于更清晰的写法:x = (x >> 24) | ((x >> 8) & 0x0000FF00) | ((x
为什么不用联合体或memcpy?位运算的优势在哪
在嵌入式、驱动或高频通信场景中,位运算方案有不可替代性:
- 零运行时开销:纯计算,不依赖内存读写或函数调用,编译后常为3–5条CPU指令
- 确定性时序:每周期耗时固定,适合硬实时系统(如CAN总线报文封包)
- 无别名风险:避免联合体(union)触发严格别名违规(strict aliasing violation)导致的未定义行为
- 可泛化:同一逻辑稍作修改就能支持16/24/32/64位任意宽度,甚至逐位翻转(bit reversal)
而联合体虽直观,但受编译器优化影响大;memcpy加__builtin_bswap32虽简洁,本质仍是黑盒调用,底层仍靠位运算实现。










