我想知道如何编写一个函数来返回是否至少有三个值不等于 0。我搜索过类似的问题,但找不到任何有效的解决方案。为了解释我的问题,这里有一个例子:
我有一个包含这些元素的数组: [1,0,2,0,4,0,0,3,0,0]。我想检查是否至少有 3 个元素不等于 0。
1如果至少有 3 个元素,我的代码将返回!= 0,0如果元素少于 3 个,我的代码将返回!=0。
所以在我的例子中它应该返回1.
在嵌入式编程讲座的这一部分中,Samek博士解释了编译器如何能够实现"原始代码"的效率(可能是由于这意味着由语法的逻辑顺序决定的实现):
我希望你注意到反汇编代码实现了与我为while循环描述的不同的控制流.原始代码应该首先测试条件,然后如果条件不正确则跳过循环体.编译后的代码以无条件分支开始,并反转循环体的顺序和条件的测试.但是,当你考虑它时,那两个控制流是等价的,除了生成的控制流更快,因为它在循环的底部只有一个条件分支.
在他的解释中,他参考了所示的两个流程图.描述编译代码的图表说明了"它在循环底部只有一个条件分支".我似乎无法看到它在实践中是如何工作的:
0x2815 CMP- > 0x1c40 ADDS- >repeat until condition is false
0x2815 CMP- > 0xdbfc BLT.N- > 0x1c40 ADDS- >repeat until condition is false
我可以理解两种控制流是如何相等的(至少从图中看是如此),但肯定不是生成的(右边)如何更快.首先,两个图表最开始的箭头导致了相同的分支.其次,尽管分支确实似乎在右侧的原理图中发生,正如您从屏幕截图中看到的那样,模拟器似乎表明两种方法都是从与比较(0x2815 CMP)相关的机器指令开始的.
我如何协调流程图与我在实践中看到的内容?