如何更简洁实现基于状态变量的LED闪烁次数条件赋值?
问题描述
现有代码如下:
NOTFREGbits.ro = ((NOTFREGbits.STS ? 3 : (1 + ((ZONEREG & 15) * 2))));
其中NOTFREGbits.ro是一个3位变量,用于存储LED的闪烁次数,取值规则明确:
- 当
NOTFREGbits.STS为真时,LED闪烁3次 - 当
NOTFREGbits.STS为假时:- 若
ZONEREG的低四位(通过掩码15过滤)全为0,LED闪烁1次 - 若
ZONEREG的低四位至少有一位为1,LED闪烁3次
- 若
当前代码仅在ZONEREG最低位变化时符合预期,其他位或组合位变化时结果不符合要求。已找到一个可行修正方案:
NOTFREGbits.ro = ((NOTFREGbits.STS ? 3 : (1 + (!!(ZONEREG & 15) * 2))));
已知!!是将掩码结果转为布尔值再还原,请问有没有更简洁的实现方式?
简洁实现方案
以下几种写法逻辑与你的正确方案完全一致,且更简洁易读:
方案1:直接逻辑判断(推荐)
通过逻辑或合并条件,直接返回对应值:
NOTFREGbits.ro = NOTFREGbits.STS || (ZONEREG & 15) ? 3 : 1;
逻辑说明:只要STS为真,或者ZONEREG低四位非零,就赋值3;否则赋值1。
方案2:移位替代乘法
利用整数布尔特性(非零值在整数运算中视为1),用移位操作替代乘法:
NOTFREGbits.ro = NOTFREGbits.STS ? 3 : (1 + ((ZONEREG & 15) != 0) << 1);
方案3:紧凑表达式写法
追求极致紧凑的话,也可以写成:
NOTFREGbits.ro = 1 + (NOTFREGbits.STS || (ZONEREG & 15)) * 2;
原理和方案1一致,通过布尔值的整数转换(真为1,假为0)计算偏移量。
这些写法都省去了!!的两次取反操作,同时保持逻辑清晰,性能与原修正方案无差异。
内容的提问来源于stack exchange,提问作者fpp
相关产品推荐
相关产品推荐

