我怎样才能做到这一点 ?
我想我应该做一些类似计算校验和的事情,但这应该在最终位中给出正整数的数量。
编辑:如果我们也不能使用“shift”怎么办
编辑2:ISA是Y86
因为我看到你非常关心性能:如果你可以用汇编语言编码,那么对于数组的每个元素,你可以从零中减去元素(或者做一些类似的技巧,如果元素是正数,将设置进位标志)然后使用零操作数执行“ADC”指令(或类似指令)。ADC 是几乎所有 CPU 都提供的指令,它代表“带进位加法”。它将操作数加上 CPU 的进位标志的值加到累加器中。所以,如果元素是正数,那么从零减去就会设置进位标志,这意味着累加器将递增;否则,进位标志将被清除,因此累加器不会递增。我认为它不会比这更快。
编辑:哦,并且,人们会否决这个问题,请说明你为什么要投反对票?因为,你看,如果你不这样做,那么像我这样的人被迫用他们的赞成票取消你的反对票。
如果你使用的是整数类型,那么保证非负数的msb为0。* 所以你需要做的就是依次隔离每个数组元素的msb,并累加。
我认为使用条件会更有效,但您可以循环遍历数组,将符号位加在一起。
您还没有指定语言,所以我将使用伪代码,假设 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