2009-07-30 10 views

答えて

18
ulong mixed = (ulong)high << 32 | low; 

キャストは非常に重要です。キャストを省略した場合は、uint(32ビット)のタイプのhighを考慮すると、32ビットの値が左側に32ビットシフトされます。 32ビット変数のシフト演算子は、right-hand-side mod32のシフト演算を使用します。uint 32ビット左にシフトすると、はノーオペレーターになります。 ulongにキャスティングするとこれが防止されます。この事実を確認

は簡単です:

uint test = 1u; 
Console.WriteLine(test << 32); // prints 1 
Console.WriteLine((ulong)test << 32); // prints (ulong)uint.MaxValue + 1 
+0

ちょうど好奇心から、キャストはなぜ必要ですか? – LiraNuna

+0

もしhighがちょうどintであれば、high << 32はすべて0になります。なぜなら、すべての変数を変数から完全にシフトしたからです。シフトを開始する前に64ビット整数*にする必要があります。 –

+0

Aric: "変数のすべてを完全に変数から外しました"これは完全に真実ではありません。私の更新された答えをお読みください。 –

2
ulong output = (ulong)highUInt << 32 + lowUInt 

それぞれ左(より高い)と(下)、右へ<<>>演算子ビットシフト。 highUInt << 32は機能的にはhighUInt * Math.Pow(2, 32)と同じですが、より高速で(IMO)簡単な構文です。

+0

それは間違っています。 'highInt'が' uint'なら 'highInt << 32 == highInt'です。 –

+0

ありがとう、キャストを追加しました。 –

1

あなたがビットシフトする前に、ULONGにhighIntを変換する必要があります。

ulong output = highInt; 
output = output << 32; 
output += lowInt; 
1

エンコード:

ulong mixed = (ulong)hi << 32 | lo; 

デコード:

uint lo = (uint)(mixed & uint.MaxValue); 
uint hi = (uint)(mixed >> 32); 
関連する問題