• ベストアンサー

ビット演算について

ビット演算について質問なんですが、例えば以下の16ビットのデータ(値は変わる)を 0111 1011 1000 0000 を 0000 0001 1101 1110 や 1111 1111 0000 0000 を 0000 0000 1111 1111 上位にあるビットを下位ビットに、下位にあるビットを上位ビットに に逆に入れたいんですが やり方が分からなく質問しました よろしくお願いします

質問者が選んだベストアンサー

  • ベストアンサー
  • tadys
  • ベストアンサー率40% (856/2135)
回答No.7

unsigned short bit_reverse(unsigned short x){ unsigned short y ; int i; for( i=0,y=0 ; i<16 ; i++ ){ y<<=1; y+= x & 1 ; x>>=1; } return y; } ループで書くと実行速度が遅くなるので、同じ命令を16回繰り返す方が速くなります。 アセンブラが使えるならば、キャリービットを使う事で&演算を使わずに同じ事が出来ます。 逆順のテーブルを引くようにすれば高速化できます。 ただし、16ビットのテーブルは大きすぎるので、4ビット又は8ビットに分けるのがよろしい。 4ビットの場合のテーブルは unsigned char reverse_tbl[16] = { 0x0,0x8,0x4,0xC,0x2,0xA,0x6,0xE,0x1,0x9,0x5,0xD,0x3,0xB,0x7,0xF }; CPUの種類によっては1命令でビットを逆順に出来るので長いコードを書く必要が有りません。 例えば、ARMマイコンには「ビット・リバーサル命令」が有ります。 http://www.aps-web.jp/academy/05/index.html

その他の回答 (6)

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.6

>ビットを逆順にしたいんだね. みんなで間違えてます…ね(汗) ループで回して設定しますかねぇ……。 演算式1発で…ってワケには行きませんな。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

あ, 間違えた. ビットを逆順にしたいんだね. 「ビット 逆順」なんかで調べると出てくるかもよ.

回答No.4

以前同じ内容の質問を投稿しました(参考URL) ベストアンサーの方がリンクされたページは表示できなくなっていましたので、 No.5の解答に示されているプログラムが良いと思います。リンク先の http://graphics.stanford.edu/~seander/bithacks.html#ReverseParallel から転載しました // 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);

参考URL:
http://okwave.jp/qa/q4689195.html
  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.3

環境によってはマクロが用意されている場合もあります。 WinDef.hにHIBYTE()やLOBYTE()、MAKEWORD()など……。 「バイトスワップ」で検索する…というのもアリでしょう。

  • tsunji
  • ベストアンサー率20% (196/958)
回答No.2

ヒントだけ、ビットシフト演算子を使うか、256を掛けるか割る。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

1. 上位 8ビットと下位 8ビットを取り出す. 2. 取り出した「上位 8ビット」を下位に, 「下位 8ビット」と上位に持つような値を計算する.

関連するQ&A