无if-else实现uint8_t变量指定位按SG1值置位/清零
无分支实现指定位的赋值操作
你需要把取值仅为0或1的unsigned 8bit变量SG1的值写入另一个8bit变量Coil的第3位(对应二进制从右数第4位),同时不影响Coil的其他位,替代原有带分支的if-else代码。
直接用位运算就能实现无分支操作,核心思路是先清除目标位,再写入新值:
Coil = (Coil & ~(1 << 3)) | (SG1 << 3);
代码解释:
~(1 << 3)生成掩码0b11110111,和Coil做按位与操作,能精准清除Coil的第3位,其他位保持原样。SG1 << 3将SG1的0/1值左移到第3位的位置,得到0b00000000或0b00001000。- 最后用按位或合并两个结果,完成目标位的赋值,其他位不受影响。
验证示例:
- 初始
Coil = 0b00010001,当SG1=1时:(0b00010001 & 0b11110111)得到0b00010001,再和0b00001000按位或,结果为0b00011001,符合要求。 - 当
SG1=0时:(0b00010001 & 0b11110111)还是0b00010001,和0b00000000按位或后变回0b00010001,完全符合预期。
另外还有一种等价写法,但不如上面直观:
unsigned char mask = (SG1 << 3) | ((~SG1) & ~(1 << 3)); Coil &= mask;
推荐优先使用第一种简洁明了的写法。
内容的提问来源于stack exchange,提问作者Hisyam Faiz
相关产品推荐
相关产品推荐

