高/低uintを設定して、c#で2つのuintをulongに結合する最良の方法は何ですか.
ビットシフトでできることは知っていますが、構文がわからないか、BitConverter のような他の API が役立つ可能性がありますが、必要な機能を実行するメソッドが見つかりません。
ulong mixed = (ulong)high << 32 | low;
キャストはとても重要です。high
型(32 ビット) であることを考慮して、キャストを省略するとuint
、32 ビット値を 32 ビット左にシフトすることになります。right-hand-side
32 ビット変数のシフト演算子は、 mod 32 でシフト スタッフを使用します。事実上、 32 ビットを左にシフトすることは no-opuint
です。にキャストするとulong
、これが防止されます。
この事実を確認するのは簡単です:
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);