在不使用任何条件跳转的情况下计算数组中的正项

时间:2011-12-10 14:59:00

标签: arrays y86

我该怎么做?

我认为我应该做一些像计算校验和的事情,但这应该给出最后一位的正整数。

编辑:如果我们不能使用'shift'怎么办

edit2:ISA为Y86

3 个答案:

答案 0 :(得分:2)

因为我看到你非常关心性能:如果你可以用汇编语言编写代码,那么对于数组的每个元素你可以从零中减去元素(或者做一些类似的技巧,如果元素设置进位标志是正的)然后用零操作数执行“ADC”指令(或类似的)。 ADC是几乎所有CPU都提供的指令,它代表“Add with Carry”。它会将操作数加上CPU的进位标志的值添加到累加器。因此,如果元素为正,则从零减去将设置进位标志,这意味着累加器将递增;否则,进位标志将被清除,因此累加器不会递增。我认为它不会比这更快。

编辑:哦,如果人们对这个问题进行投票,请说明你为什么要投票?因为,你看,如果你不这样做,那么会发生的事情就是像我这样的人被迫取消你的投票结果。

答案 1 :(得分:1)

如果使用整数类型,那么可以保证非负数的msb为0. * 所以你需要做的就是隔离每个数组元素的msb转身,积累。

<小时/> *这适用于二进制补码,一补数和符号量。

答案 2 :(得分:1)

我认为使用条件会更有效,但你可以遍历数组,将符号位加在一起。

你没有指定语言,所以假设有32位有符号整数,我将使用伪代码:

Set accumulator to 0
For each element in array
    sign = (element bitwise and 0x80000000) logical shift right by 31
    accumulator += sign
positive_count = length of array - accumulator