3

私は持っています

_int8 arr[0] = 0;
_int8 arr[1] = 0;
_int8 arr[2] = 14;
_int8 arr[3] = 16;

最初の部分<..>としてarr[0]を使用し、最後の部分としてarr [3]を使用して、これを1つの_int32に変換する必要があります。結局、それは

_int32 back = 3600;

これを実現するには、ビットシフトまたはそのようなsmthを使用する必要がありますか?

4

3 に答える 3

8

それらをすべてキャストしてからint使用します:

(arr[0] << 24) | (arr[1] << 16) | (arr[2] << 8) | arr[3]

または:

_int32 back = 0;
for (int i = 0; i < 4; ++i)
    back = (back << 8) | arr[i];
于 2011-01-16T17:51:37.660 に答える
4

バイト順 (つまり、ビッグ エンディアンまたはリトル エンディアン、ウィキペディアで確認してください) を知っていて、配列が正しい順序で設定されている場合は、次のように実行できます。

back = *(_int32 *)arr;

これは、4 バイトの配列を単一の 32 ビット整数を保持するバッファーとして解釈するだけです。ただし、あなたの例では、ビッグエンディアン用にセットアップされていると思いますが、x86 はそうではありません。したがって、いくつかのバイトを交換する必要があります。

例えば:

_int32 back = arr[0] << 24 | arr[1] << 16 | arr[2] << 8 | arr[3];

またはそのようなもの。

于 2011-01-16T17:53:53.260 に答える
1

おそらく私の SCO コンパイラですが、シフトを行うために (arr[0]&0xff) などを使用しないと問題が発生したと思います。確かに何も痛くありません。

于 2011-01-16T19:04:26.403 に答える