4

例えば:

入力: 01011111

出力: 00000101

を使用~して数字を裏返すことができることは知っていますが、逆にする良い方法がわかりません。そして、それらが一緒にできるかどうかはわかりません。

誰にもアイデアはありますか?

4

1 に答える 1

8

この種のことについては、素晴らしいビットをいじるハックのWebページにアクセスすることをお勧めします。そのページの解決策の1つは次のとおりです。

3つの演算(64ビットの乗算とモジュラス除算)で1バイトのビットを反転します。

unsigned char b; // reverse this (8-bit) byte

b = (b * 0x0202020202ULL & 0x010884422010ULL) % 1023;

乗算操作は、8ビットバイトパターンの5つの個別のコピーを作成して、64ビット値にファンアウトします。AND演算は、各10ビットグループのビットに対して、正しい(反転した)位置にあるビットを選択します。乗算およびAND演算は、元のバイトからビットをコピーするため、それぞれが10ビットセットの1つにのみ表示されます。元のバイトのビットの逆の位置は、任意の10ビットセット内の相対位置と一致します。2 ^ 10-1によるモジュラス除算を含む最後のステップには、64ビットの10ビットの各セット(位置0-9、10-19、20-29、...)をマージする効果があります。価値。それらは重複しないため、モジュラス除算の基礎となる加算ステップは、または演算のように動作します。

この方法は、Beeler、M.、Gosper、RWおよびSchroeppel、R.HAKMEMのProgrammingHacksセクションにあるRichSchroeppelによるものです。MIT AIメモ239、1972年2月29日。

そして、64ビット整数を使用しない別のソリューションを次に示します。

7つの操作(64ビットなし)で1バイトのビットを反転します

b =((b * 0x0802LU&0x22110LU)|(b * 0x8020LU&0x88440LU))* 0x10101LU >> 16;

結果をunsignedcharに割り当てるかキャストして、上位ビットのガベージを削除してください。2001年7月13日、Sean Andersonによって考案されました。Typoは、2002年1月3日、MikeKeithによって発見および修正されました。

于 2012-08-30T19:01:50.603 に答える