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

如何通过指针实现位操作?求修正交换字节半字节最高位的函数

指针位操作完全可行,你的代码问题出在这几个地方

首先明确:指针完全可以用来做位操作,通过解引用指针*b就能拿到目标字节的值,后续和直接操作普通变量的位操作逻辑完全一致。

你的代码没法正常运行,核心是这两个错误:

  1. 取低半字节最高位的方式错了
    uint8_t是8位数据,*b >> 8会把所有位都移出,结果永远是0,所以bit2的值一直是0,根本没取到想要的低半字节最高位(也就是bit3,从0开始计数)。正确的写法应该是bit2 = (*b >> 3) & 1;

  2. 构造异或掩码的位移错误
    同样,uint8_t左移8位结果也是0,x << 8等于没加。你需要把异或后的结果放到bit7和bit3的位置,而不是bit4和bit8(bit8根本不存在)。

修正后的代码可以这样写:

void swapBits(uint8_t *b)              
{
    uint8_t bitA = (*b >> 7) & 1; // 取高半字节最高位(bit7)
    uint8_t bitB = (*b >> 3) & 1; // 取低半字节最高位(bit3)
    uint8_t x = bitA ^ bitB;
    x = (x << 7) | (x << 3); // 构造掩码,把异或值放到目标位
    *b ^= x;    
}

或者更直观的写法,先清除目标位再重新赋值:

void swapBits(uint8_t *b)
{
    uint8_t val = *b;
    // 提取两个目标位
    uint8_t bit7 = (val >> 7) & 1;
    uint8_t bit3 = (val >> 3) & 1;
    // 清除原有的bit7和bit3
    val &= ~((1 << 7) | (1 << 3));
    // 把两个位交换位置后赋值回去
    val |= (bit7 << 3) | (bit3 << 7);
    *b = val;
}

这两种写法都能实现把0bAxxxBxxx转换成0bBxxxAxxx的需求。

内容的提问来源于stack exchange,提问作者codemaverick

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 00:20:32