3

私の解決策:(入力ブロックのすべてのビットに対して、そのような行があります)

*parity ^= (((x[0] >> 30) & 0x00000001) * 0xc3e0d69f);

すべての型は uint32 です。この行は、入力 x の 2 番目のビットを取り、それを LSB にシフトし、他のすべてのビットをゼロに設定します。次に、32 ビットのパリティが、このビットに設定された対応するパリティと XOR されます。

この乗算ソリューションが、この条件付き XOR を実行する最速の方法であることがわかりました。もっと速い方法はありますか?

4

5 に答える 5

4

ワード、バイトなどのパリティを計算するためのいくつかの巧妙なハックについては、ここを参照してください

于 2010-11-17T20:11:01.140 に答える
3

どのような種類のパリティを意味するのか完全には理解できませんが、このコード行が目的どおりに機能している場合は、改善される可能性があります。

一般的な規則: {0, 1}のx について x * N == - x & N

これは、0 の場合の -x はすべてのビットがリセットされ、1 の場合はすべてのビットが設定される -1 であるためです。

したがって、元のコード行は次のように書き直すことができます。

*parity ^= (-((x[0] >> 30) & 0x00000001) & 0xc3e0d69f);

多くのマイクロプロセッサで乗算よりも短い時間で計算された 2 つの演算ですが、これを確認する必要があります。

また、コードは符号付き右シフトを利用する場合があります

*parity ^= (((int32_t)x[0] << 1 >> 31) & 0xc3e0d69f);

最初に 30 番目のビットを rshift して符号ビットである 31 番目にシフトし、次に 2 番目に他のすべての符号ビットを拡張します。ほとんどのマシンでは右シフトが floor( x / 2 N ) として機能するため、シフトされたビットを符号ビット ( abc...yz>>3 == aaaabc...yz) で埋めます。

しかし、これらのトリックはC 標準では未定義の動作として記述されているため、移植性がありません。慎重に使用してください。

于 2010-11-17T21:51:35.330 に答える
1

一部のプロセッサがこれを行います。x86 のパリティ フラグを参照してください。

于 2010-11-17T20:34:02.757 に答える
0

私が質問を正しく理解していれば、あなたはやっています

for (i = 0; i < 32; i++)
    *parity ^= (((x[0] >> i) & 1) * SOME_CONST[i]); 

その場合は、ルックアップテーブルを使用することをお勧めします。

for (i = 0; i < 4; i++)
    *parity ^= PARITY_LUT[i][ (x[0] >> (i*8)) & 0xFF];

256kbの費用がかかりますが、はるかに高速になります。

于 2010-11-18T00:48:38.330 に答える