4

重複の可能性:
符号なし整数の C リバース ビット

二項演算子のみを使用して二進数を反転するにはどうすればよいですか?

例えば:

11100000 -> 00000111
00110100 -> 00101100
00111111 -> 11111100
4

3 に答える 3

11

この種のことについては、すばらしいページBit Twiddling Hacksをご覧になることをお勧めします。

そのページから抜粋したソリューションの例を次に示します。

3 つの演算 (64 ビット乗算と剰余除算) でバイト内のビットを反転します。

unsigned char b; // reverse this (8-bit) byte 
b = (b * 0x0202020202ULL & 0x010884422010ULL) % 1023;

コメントで指摘されているように、ここに別のオプションがあります:

5 * lg(N) 操作で並列に N ビット量を反転します

unsigned int v; // 32-bit word to reverse bit order

// swap odd and even bits
v = ((v >> 1) & 0x55555555) | ((v & 0x55555555) << 1);
// swap consecutive pairs
v = ((v >> 2) & 0x33333333) | ((v & 0x33333333) << 2);
// swap nibbles ... 
v = ((v >> 4) & 0x0F0F0F0F) | ((v & 0x0F0F0F0F) << 4);
// swap bytes
v = ((v >> 8) & 0x00FF00FF) | ((v & 0x00FF00FF) << 8);
// swap 2-byte long pairs
v = ( v >> 16             ) | ( v               << 16);
于 2012-10-15T20:24:36.817 に答える
3

Bit Twiddling Hacksをご覧ください。ビットシーケンスの反転に関するセクション全体があります。

于 2012-10-15T20:24:01.200 に答える
2

このウェブサイトを見ることができますhttp://graphics.stanford.edu/~seander/bithacks.html

ビット シーケンス
の反転 明らかな方法で
ビットを反転 ルックアップ テーブル
ごとにワード内のビットを反転 3 つの演算 (64 ビット乗算とモジュラス除算)
でバイト内のビットを反転 4 つの演算 (64 ビット乗算、除算なし) でバイト内のビットを反転)
バイト内のビットを 7 回の操作で反転します (64 ビットではなく、32 ビットのみ)
5 * lg(N) 操作で並列に N ビット量を反転します

于 2012-10-15T20:23:55.790 に答える