誰かが次のコードが何をするのか説明してください。
private int ReadInt32(byte[] _il, ref int position)
{
return (((il[position++] | (il[position++] << 8)) | (il[position++] << 0x10)) | (il[position++] << 0x18));
}
このメソッドのビット単位の演算子がどのように機能するかを理解していないので、分解してもらえますか?
誰かが次のコードが何をするのか説明してください。
private int ReadInt32(byte[] _il, ref int position)
{
return (((il[position++] | (il[position++] << 8)) | (il[position++] << 0x10)) | (il[position++] << 0x18));
}
このメソッドのビット単位の演算子がどのように機能するかを理解していないので、分解してもらえますか?
整数はバイト配列として与えられます。次に、各バイトが 0/8/16/24 桁左にシフトされ、これらの値が合計されて整数値が取得されます。
これはInt32
16 進形式です。
0x10203040
次のバイト配列として表されます (リトル エンディアン アーキテクチャのため、バイトは逆順です)。
[0x40, 0x30, 0x20, 0x10]
配列から整数を作成するために、各要素がシフトされます。つまり、次のロジックが実行されます。
a = 0x40 = 0x00000040
b = 0x30 << 8 = 0x00003000
c = 0x20 << 16 = 0x00200000
d = 0x10 << 24 = 0x10000000
次に、これらの値を OR で結合します。
int result = a | b | c | d;
this gives:
0x00000040 |
0x00003000 |
0x00200000 |
0x10000000 |
------------------
0x10203040
次のように考えてください。
var i1 = il[position];
var i2 = il[position + 1] << 8; (<< 8 is equivalent to * 256)
var i3 = il[position + 2] << 16;
var i4 = il[position + 3] << 24;
position = position + 4;
return i1 | i2 | i3 | i4;