答案 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