2011-11-08 10 views
1

可能性の重複:
Best Algorithm for Bit Reversal (from MSB->LSB to LSB->MSB) in Cビットストリーム用の標準C関数はありますか?

私は、64ビット・ワードを持っていると私はそれに対して次の操作をしたいです。

私は(ようにビット1とビット0 スワップビット62とのスワップビット63と)ビットスワップをしたいまず

上記の操作が完了したら、私はバイトスワップスワップをしたいですバイト0とバイト7の間 バイト1とバイト6など。

は、今、私たちは)(第二部のbswap_64を行うにはgccのLinuxでの作り付けの機能を持っています。GCCのLinuxのCで利用可能な最初の部分を行うのですかいずれかの機能があります

+1

いいえ、しかし、これらの操作を行う「演算子」と呼ばれるものがあります。 –

+0

**なぜ**ビットを交換したいですか? FFTか宿題のいずれか、IMHO。 – wildplasser

+0

@ wildplasser.itは宿題ではなくFFTでもありません。私はXGMIIコード化フレームに変換しようとしているアイドル状態の10GEフレームをキャプチャしました。 :) – liv2hak

答えて

6

正味の効果は、bit-と同じです各バイトを所定の位置にスワップします。例えば、バイト0はまずビット7にコピーされ、そのビットは反転され、次にビット反転なしでバイト0にコピーバックされる。

これらの操作はビルトインでサポートされていませんが、各バイトをビットスワップするのはかなり簡単です。最も効率的な方法はおそらく256要素ルックアップテーブルです。あなたは、各バイト値のビットスワップ値を計算し、bytesの初期化のためのソースコードを生成する小さなプログラムを書くことができ

const unsigned char reverse[UCHAR_MAX+1] { 
    0x00, 0x80, ..., 0xFF 
} 

uint64_t the_word = /* whatever */ 
unsigned char *bytes = &the_word; 
for (i = 0; i < 7; i ++) { 
    bytes[i] = reverse[bytes[i]]; 
} 

。 (とにかく計算を行うためのコードを書いているので、ルックアップテーブルの代わりにあなたのプログラムで使うことができます;速度はどれほど重要であるかによって決まります。)

これは、そのCHAR_BIT == 8は、言語によって保証されていません。

これはテストしていません。

+0

ベンチマーク[there](http://stackoverflow.com/questions/746171/best-algorithm-for-bit-reversal-from-msb-lsb-to-lsb-msb-in-c)によると、コンパイラは賢明ではないかもしれない(そしてバイトアドレス指定は通常遅い)ので、手動でループをアンロールして整数算術を使うほうがよい。 'bytes'を' restrict'として宣言することも役に立ちます。ベンチマーキングはもちろんあなたのガイドです。 –

+0

@AlexandreC .:私はタイプミスを修正しました。 –