0

これらのコード行が何をするのか誰か教えてください

*(a++)  = (int)((value >> 16) & 0xFF) ;
*(a++)  = (int)((value >> 8) & 0xFF) ;  
*(a++)  = (int)((value & 0xFF)) ;

値をチェックすることを理解しています。16 よりもはるかに大きい場合は int 型に変換し、8 よりもはるかに小さい場合は同じことを行います。しかし、
& 0xFFと は何をするの*(a++)でしょうか?

4

4 に答える 4

2

値をチェックすることを理解しています

何もチェックしません<<。「はるかに小さい」を意味する数学の記号とは異なります。この行を分解するには:

*(a++)  = (int)((value >> 16) & 0xFF);
  • ( >>)は右に 16 回シフトします。 value
  • ( &)で結果をAND0xFFします。これにより、左側のすべてが破棄されます。
  • が指すアドレスに結果を格納します。a
  • ポインターをインクリメントし、a「次の」要素を指すようにします
于 2012-08-07T10:16:12.393 に答える
1

与えられた:

char data[10];

uint32_t value = 0x61626364; // 'abcd'

char *a = data;
*(a++) = (int)((value >> 24) & 0xFF);
*(a++) = (int)((value >> 16) & 0xFF);
*(a++) = (int)((value >> 8) & 0xFF);
*(a++) = (int)(value & 0xFF);
*(a++) = ':';
*((uint32_t *)a) = value;
a+=4;
*(a++) = 0;

printf("%s\n", data);

私は得ます(リトルエンディアンシステムであるインテルボックスで):

abcd:dcba

したがって、これにより、整数のバイトがプラットフォームに依存しない形式 (バイト形式としてビッグ エンディアンを選択) になることが保証されます。

今、次の場合:

*(a++) = (int)((value >> 16) & 0xFF);

我々は持っています:

0x61626364 -- value
0x00006162 -- value >> 16 : shifted 2 bytes
0x00000062 -- (value >> 16) & 0xFF : last byte only
于 2012-08-07T10:41:45.017 に答える
1
*(a++)  = (int)((value >> 16) & 0xFF) ; 

のようなものです:

aIntValue = value/65536;
aIntBalue = a%256;

*(a++)  = (int)((value >> 8) & 0xFF) ;   

のようなものです:

aIntValue = value/256;
aIntValue = a%256;

*(a++)  = (int)((value & 0xFF)) ; 

のようなものです:

aIntValue = a%256;

コードの最後で、いずれかのコードが aIntValut をポインター 'a' を指す値に割り当て、次にポインターを次の要素に移動します。

于 2012-08-07T10:18:22.187 に答える
1

(値>>16)

いいえ、それほど大きくはありません。

It is shift right by 16 bits.

しかし、それを 2 で割ると、ちょうど 16 倍になるので、以前よりもずっと小さくなります。

val&0xff makes a solution if it is divisible by 256. For example: if val&0xff is different than zero, than it is not divisible by 256
于 2012-08-07T10:15:14.233 に答える