2

重複の可能性:
Cでビッグエンディアンをリトルエンディアンに変換[提供された関数を使用せずに]

この部分で問題が発生しています。32ビットの数値を取得し、そのバイト(1バイト= 8ビット)をビッグエンディアンからリトルエンディアンの形式にシフトしたい場合。例えば:

私が1番だとしましょう。

32ビットでは、これは次のようになります。

1st byte 2nd byte 3rd byte 4th byte
00000000 00000000 00000000 00000001

私はそれがこのように見えるようにしたいです:

4th byte 3rd byte 2nd byte 1st byte 
00000001 00000000 00000000 00000000 

最下位のバイトが最初に表示されるようにします。forループを使用できると思っていましたが、C++でビット/バイトをシフトする方法が正確にはわかりません。たとえば、ユーザーが1を入力し、上記の例のようにビットをシフトする必要がある場合、1をビットに変換してからシフトする方法がわかりません。誰かが私を正しい方向に向けることができますか?ありがとう!

4

3 に答える 3

4

<<Cおよび>>他のほとんどのCスタイル言語のビット単位のシフト演算子です。

やりたいことをする1つの方法は次のとおりです。

int value = 1;
uint x = (uint)value;
int valueShifted = 
    ( x << 24) |                // Move 4th byte to 1st
    ((x << 8) & 0x00ff0000) |  // Move 2nd byte to 3rd
    ((x >> 8) & 0x0000ff00) |  // Move 3rd byte to 2nd
    ( x >> 24);                 // Move 4th byte to 1st
于 2012-11-30T20:26:40.050 に答える
2
uint32_t n = 0x00000001;
std::reverse( (char*)&n, (char*)(&n + 1) );
assert( n == 0x01000000 );
于 2012-11-30T20:28:48.697 に答える
0

シフトは<<and>>演算子で行われます。ビット単位のAND(&)およびOR(|)演算子を使用すると、次のことを実行できます。

 int value = 1;
 int shifted = value << 24 | (value & 0x0000ff00) << 8 | (value & 0x00ff0000) >> 8 | (value & 0xff000000) >> 24;
于 2012-11-30T20:30:20.763 に答える