例えば:
入力: 01011111
出力: 00000101
を使用~
して数字を裏返すことができることは知っていますが、逆にする良い方法がわかりません。そして、それらが一緒にできるかどうかはわかりません。
誰にもアイデアはありますか?
例えば:
入力: 01011111
出力: 00000101
を使用~
して数字を裏返すことができることは知っていますが、逆にする良い方法がわかりません。そして、それらが一緒にできるかどうかはわかりません。
誰にもアイデアはありますか?
この種のことについては、素晴らしいビットをいじるハックの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、...)をマージする効果があります。価値。それらは重複しないため、モジュラス除算の基礎となる加算ステップは、または演算のように動作します。
そして、64ビット整数を使用しない別のソリューションを次に示します。
7つの操作(64ビットなし)で1バイトのビットを反転します。
b =((b * 0x0802LU&0x22110LU)|(b * 0x8020LU&0x88440LU))* 0x10101LU >> 16;
結果をunsignedcharに割り当てるかキャストして、上位ビットのガベージを削除してください。2001年7月13日、Sean Andersonによって考案されました。Typoは、2002年1月3日、MikeKeithによって発見および修正されました。