半字节交换问题:输入0x1234期望输出0x2143却得到0x4321
问题排查与修复
核心问题分析
你的代码存在三个关键问题,导致结果不符合预期:
SWAP宏逻辑错误:当前宏仅处理了低8位的半字节交换,完全未处理高8位的两个半字节。你需要对16位数据的每个字节内部做半字节交换(0x12→0x21,0x34→0x43),但原宏只操作了低字节的3和4,高字节的1和2根本没被处理。- 函数调用错误:使用了
print而非标准库的printf,这会直接导致编译失败。 - 字符串格式错误:输出字符串里的换行应该用
\n,直接换行会触发编译报错。
修复方案
先定义单个字节的半字节交换宏,再扩展到16位数据的两个字节,同时修正编译错误:
#include <stdio.h> // 单个字节内的半字节交换 #define NIBBLE_SWAP_BYTE(byte) (((byte) & 0x0F) << 4) | (((byte) & 0xF0) >> 4) // 16位数据:分别交换高、低字节的半字节,再组合 #define SWAP(num) (NIBBLE_SWAP_BYTE((num) >> 8) << 8) | NIBBLE_SWAP_BYTE((num) & 0xFF) int main() { short input = 0x1234; short output = SWAP(input); printf("Input: 0x%04X\n", input); printf("Output: 0x%04X\n", output); return 0; }
修复说明
NIBBLE_SWAP_BYTE负责处理单个字节:比如0x12,先提取低4位0x2左移4位到高4位,再提取高4位0x1右移4位到低4位,最终得到0x21。SWAP宏把16位数据拆成高8位(0x12)和低8位(0x34),分别调用单字节交换宏,再把交换后的高字节左移8位,和低字节组合,得到目标结果0x2143。- 同时修正了
print为printf,并添加正确的换行符\n。
内容的提问来源于stack exchange,提问作者Saikumar
相关产品推荐
相关产品推荐

