如何通过指针实现位操作?求修正交换字节半字节最高位的函数
指针位操作完全可行,你的代码问题出在这几个地方
首先明确:指针完全可以用来做位操作,通过解引用指针*b就能拿到目标字节的值,后续和直接操作普通变量的位操作逻辑完全一致。
你的代码没法正常运行,核心是这两个错误:
取低半字节最高位的方式错了
uint8_t是8位数据,*b >> 8会把所有位都移出,结果永远是0,所以bit2的值一直是0,根本没取到想要的低半字节最高位(也就是bit3,从0开始计数)。正确的写法应该是bit2 = (*b >> 3) & 1;构造异或掩码的位移错误
同样,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
相关产品推荐
相关产品推荐

