アプリ版:「スタンプのみでお礼する」機能のリリースについて

シフト演算を用いて、データを変換したいのです。

例えば、「00 01 0B 0A」となっているデータを、「0A 0B 01 00」となるようにシフト演算を用いて、変換したいのです。
0Aで1byteとなっていて、1byteごとにデータを格納して入れ替えるなど、方法は考えてみたのですが、実際のプログラムがさっぱり思いつきません。

ヒントだけでもいいので、教えていただけると嬉しいです。
すみませんが、よろしくお願いします。

A 回答 (3件)

リトルエンディアンからビッグエンディアンまたはビッグエンディアンからリトルエンディアンへの変換ですね。



シフト演算子を使って計算するのであれば、ビット演算子を使えば実現できますね。

例えば、C言語風に書けば

i = 0x00010b0a ;
i = i<<24 | i<<8 & 0x00ff0000 | i>>8 & 0x0000ff00 | i>>24 & 0x000000ff ;

で出来ていると思います。
演算子の優先順位があるので、言語が違えば答えが変わってしまう可能性もありますので、

i = (i<<24) | ((i<<8) & 0x00ff0000) | ((i>>8) & 0x0000ff00) | ((i>>24) & 0x000000ff) ;

の様に括弧でくくる必要があるかもしれません。
    • good
    • 0
この回答へのお礼

なるほど!!ORとANDをフル活用ですねー
ありがとうございます!!

エンディアンと書かなくても、わかるもんなのですね^^;

お礼日時:2004/07/31 00:36

エンディアン変換ですか。


シフトして0xFF000000,0x00FF0000,0x0000FF00,0x000000FF
などとANDすれば欲しいバイトは32bitのままでも取れますでしょう。左シフトで0が埋まるとこはANDも必要ないですけど。
で、ORすればいいだけです。

最高速のアルゴリズムは、そこから考えてみてください。
    • good
    • 0
この回答へのお礼

そういう考え方をすればいいのですねー考えてみます!!
ありがとうござます!!

お礼日時:2004/07/31 00:34

この4バイトはunsigned longと思って良いのかな? 泥臭い処理をするとすれば以下のようになるのではないかな。



unsigned long x = 0x00010b0aL; // x をシフトしたいブツとしよう
unsigned long swapvar = (x >> 24); // swapvarにxの最上位1バイトを最下位1バイト目として保存
x <<= 8; // x を1バイト分シフト
x |= swapvar; // シフトしたxとswapvarを組み合わせてシフト完了

検証はしていないのでバグがあったらごめん。
    • good
    • 0
この回答へのお礼

ありがとうございます。よく考えてみます。

お礼日時:2004/07/31 00:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!