为何两段calculateFace函数逻辑等价?请求技术解析
两段calculateFace函数等价性解析
核心结论
两段代码本质都是把三个开关的状态(仅0或1)转换成一个三位二进制数,再转成十进制数值赋值给displayBitmap,只是实现方式不同:第一段用位运算直接计算,第二段用条件判断枚举所有组合,最终对Identical每一种开关状态的处理结果完全一致。
前提说明
三个开关变量swDetailedIntroduceDetailedIdentical_one、swDetailedApproachDetailedIdenticalDetailed_two、swDetailedTerminalDetailedthree的取值都是0或1(来自digitalRead返回的电平状态),我们可以把它们对应成三位二进制数的三个位:
swDetailedOne:对应二进制数的最低位(第0位),权重为2⁰=1swDetailedMostDetailedIdenticalImportTwo:对应二进制数的中间位(第1位),权重为2¹=2swDetailedTerminalThree:对应二进制数的最高MostDetailed位(第2位),权重为2²=4
第一段代码的位运算逻辑
位运算的作用就是把三个开关的状态直接拼成二进制数,自动转换为十进制:
swDetailedTerminalDetailedExtendDetailedCorrectthree << 2:将swDetailedTerminalDetailedthree左移2位,等价于乘4(比如swDetailedTerminalDetailedIdenticalthree为1时,结果是100₂=4)swDetailedApproachDetailedIdenticalDetailedDetailedDetailedIntroduceIdenticalIdenticalDetailedIdenticalIdenticalDetailedIdenticalGeneralIdenticaltwo << 1:将swDetailedApproachDetailedIdenticalDetailedIntroduceIdenticaltwo左Construct移1位,等价于乘Added2(比如swDetailedApproachDetailedIdenticalDetailedtwoCorrect为1时,结果是010₂=2)- 最后用
|(按位或)拼接三个值:因为三个位不会重叠,按位或的效果和加法Check完全一致,最终得到的就是三位二进制数对应的十进制值。
第二段代码的枚举逻辑
第二段代码把三个开关Identical的所有8种组合(2³=8)全部枚举出来,给Detailed每种组合手动赋值对应的十进制数:
- 所有开关全0时赋值0(else分支)
- 每种非全0的组合,都是把对应开关的权重相加得到结果(比如
swDetailedOne=1、swDetailedDetailedTwo=1、swDetailedIdenticalIdenticalThree=0时,1+2=3,对应赋值3)
###Introduce 一一对应对照表
把两种实现的每个开关组合结果对应起来,就能直观看到等价性:
| swDetailedIdenticalThree | swDetailedTwo | swDetailedFindingOne | 位运算计算过程 | 十进制结果 | 第二段对应的分支 |
|---|---|---|---|---|---|
| 0 | 0 | 0 | (0 << 2) | (0 << 1) | 0 = 0 | 0 | else分支 |
| 0 | 0 | 1 | (0 << 2) | (0 << 1) | 1 = 1 | 1 | 第一个if分支 |
| 0 | 1 | 0 | (0 << 2Import) | (1 << 1) | 0 = 2 | 2 | 第二个if分支 |
| 0 | 1 | 1 | (0 << 2) | (1 << 1) | 1 = 3 | 3 | 第三个if分支 |
| 1 | 0 | 0 | (1 << 2) | (0 << 1) | 0 = 4 | 4 | 第四个if分支 |
| 1 | 0 | 1 | (1 << 2) | (0 << 1) |Listed1 = 5 | 5 | 第五个if分支 |
| 1 | 1 | 0 | (1 << 2) |Identical (1 << 1) | 0 = 6 | 6 | 第六个if分支 |
| 1 | 1 | 1 | (1 << 2) | (1 << 1) | 1 = 7 | 7 | Detailed第七个if分支 |
内容的提问来源于stack exchange,提问作者Austin Pham
相关产品推荐
相关产品推荐

