- ベストアンサー
ビット演算について
ビット演算について質問なんですが、例えば以下の16ビットのデータ(値は変わる)を 0111 1011 1000 0000 を 0000 0001 1101 1110 や 1111 1111 0000 0000 を 0000 0000 1111 1111 上位にあるビットを下位ビットに、下位にあるビットを上位ビットに に逆に入れたいんですが やり方が分からなく質問しました よろしくお願いします
- みんなの回答 (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)
>ビットを逆順にしたいんだね. みんなで間違えてます…ね(汗) ループで回して設定しますかねぇ……。 演算式1発で…ってワケには行きませんな。
- Tacosan
- ベストアンサー率23% (3656/15482)
あ, 間違えた. ビットを逆順にしたいんだね. 「ビット 逆順」なんかで調べると出てくるかもよ.
- akayoroshi
- ベストアンサー率50% (46/91)
以前同じ内容の質問を投稿しました(参考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);
- Wr5
- ベストアンサー率53% (2173/4061)
環境によってはマクロが用意されている場合もあります。 WinDef.hにHIBYTE()やLOBYTE()、MAKEWORD()など……。 「バイトスワップ」で検索する…というのもアリでしょう。
- tsunji
- ベストアンサー率20% (196/958)
ヒントだけ、ビットシフト演算子を使うか、256を掛けるか割る。
- Tacosan
- ベストアンサー率23% (3656/15482)
1. 上位 8ビットと下位 8ビットを取り出す. 2. 取り出した「上位 8ビット」を下位に, 「下位 8ビット」と上位に持つような値を計算する.