C#で2つのuintをulongに結合する最良の方法は何ですか
質問
C#で2つのuintをulongに結合し、高/低uintを設定する最良の方法は何ですか
ビットシフトができることは知っていますが、構文はわかりません。または、BitConverterのような他のAPIが役立つかもしれませんが、私が望むことをするメソッドがありません。
解決
ulong mixed = (ulong)high << 32 | low;
キャストは非常に重要です。 high
のタイプがuint
(32ビット)であることを考慮すると、キャストを省略すると、32ビット値を32ビット左にシフトします。 32ビット変数のシフト演算子は、right-hand-side
mod 32によるシフトスタッフを使用します。事実上、 ulong
32ビットを左にシフトすると、無操作 になります。 <=>へのキャストはこれを防ぎます。
この事実の確認は簡単です:
uint test = 1u;
Console.WriteLine(test << 32); // prints 1
Console.WriteLine((ulong)test << 32); // prints (ulong)uint.MaxValue + 1
他のヒント
ulong output = (ulong)highUInt << 32 + lowUInt
<<
および>>
演算子は、それぞれ左(上)および右(下)にビットシフトします。 highUInt << 32
は機能的にはhighUInt * Math.Pow(2, 32)
と同じですが、より高速で(IMO)より単純な構文です。
ビットシフトする前にhighIntをulongに変換する必要があります:
ulong output = highInt;
output = output << 32;
output += lowInt;
エンコード:
ulong mixed = (ulong)hi << 32 | lo;
デコード:
uint lo = (uint)(mixed & uint.MaxValue);
uint hi = (uint)(mixed >> 32);
所属していません StackOverflow