これどうやってするの ?
チェックサムを計算するようなことをするべきだと思いますが、これは最終ビットに正の整数の数を与えるはずです。
編集:「シフト」も使用できない場合はどうなりますか
edit2: ISAはY86です
あなたがパフォーマンスについて非常に懸念していることがわかったので、アセンブリ言語でコーディングできる場合は、配列の各要素に対してゼロから要素を減算できます (または、要素が正の場合にキャリー フラグを設定する同様のトリックを実行します)。次に、ゼロオペランドで「ADC」命令(または同様の命令)を実行します。ADC は、ほぼすべての CPU が提供する命令であり、「Add with Carry」の略です。オペランドに加えて、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