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

半字节交换问题:输入0x1234期望输出0x2143却得到0x4321

问题排查与修复

核心问题分析

你的代码存在三个关键问题,导致结果不符合预期:

  1. SWAP宏逻辑错误:当前宏仅处理了低8位的半字节交换,完全未处理高8位的两个半字节。你需要对16位数据的每个字节内部做半字节交换(0x12→0x21,0x34→0x43),但原宏只操作了低字节的3和4,高字节的1和2根本没被处理。
  2. 函数调用错误:使用了print而非标准库的printf,这会直接导致编译失败。
  3. 字符串格式错误:输出字符串里的换行应该用\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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 03:28:14