0

我怎样才能做到这一点 ?

我想我应该做一些类似计算校验和的事情,但这应该在最终位中给出正整数的数量。

编辑:如果我们也不能使用“shift”怎么办

编辑2:ISA是Y86

4

3 回答 3

2

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

编辑:哦,并且,人们会否决这个问题,请说明你为什么要投反对票?因为,你看,如果你不这样做,那么像我这样的人被迫用他们的赞成票取消你的反对票。

于 2011-12-10T15:21:21.933 回答
1

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


* 对于二的补码、一的补码和符号量级,这是正确的。

于 2011-12-10T15:02:11.537 回答
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
于 2011-12-10T15:04:11.313 回答