如何对8位寄存器中的指定位进行位翻转操作?
8位寄存器指定位操作:置位与翻转
一、把指定位强制设为1(置位)
你的示例需求是将某些位固定设为1、不改动其他位,这时候不能用按位与&——按位与会把对应掩码位为1的部分清零,这就是你代码出错的核心原因。正确做法是用按位或运算符|:
示例1修正
unsigned char regVal = 0xB5; // 二进制:1011 0101 // 目标:将0-3位设为1,保留4-7位,预期结果1011 1111(0xBF) unsigned char mask = 0x0F; // 0-3位为1的掩码,等价于0x01|0x02|0x04|0x08(你之前写的0x03是错误的,0x03仅对应0-1位) unsigned char result = regVal | mask; // 计算结果:0xB5 | 0x0F = 0xBF
示例2修正
unsigned char regVal = 0x6D; // 二进制:0110 1101 // 目标:将4位(0x10)和7位(0x80)设为1,保留其他位,预期结果1111 1101(0xFD) unsigned char mask = 0x80 | 0x10; // 掩码:10010000 unsigned char result = regVal | mask; // 计算结果:0x6D | 0x90 = 0xFD
二、真正的位翻转(0变1,1变0)
如果你的需求是让指定位不管原来值是什么,直接取反,这时候要用按位异或运算符^。比如:
unsigned char regVal = 0xB5; // 二进制:1011 0101 unsigned char mask = 0x0F; // 要翻转0-3位 unsigned char result = regVal ^ mask; // 结果:1011 1010(0xBA),原0-3位的0101翻转为1010
核心运算符总结
- 置位(强制设为1):
regVal | mask,掩码中目标位设为1 - 清零(强制设为0):
regVal & ~mask,掩码中目标位设为1,取反后用按位与清零 - 翻转(0变1/1变0):
regVal ^ mask,掩码中目标位设为1
内容的提问来源于stack exchange,提问作者jabroni
相关产品推荐
相关产品推荐

