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

无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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 08:56:06