9

高/低uintを設定して、c#で2つのuintをulongに結合する最良の方法は何ですか.

ビットシフトでできることは知っていますが、構文がわからないか、BitConverter のような他の API が役立つ可能性がありますが、必要な機能を実行するメソッドが見つかりません。

4

4 に答える 4

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

キャストはとても重要です。high型(32 ビット) であることを考慮して、キャストを省略するとuint、32 ビット値を 32 ビット左にシフトすることになります。right-hand-side32 ビット変数のシフト演算子は、 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
于 2009-07-30T21:21:32.060 に答える
2
ulong output = (ulong)highUInt << 32 + lowUInt

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

于 2009-07-30T21:20:36.180 に答える
1

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

ulong output = highInt;
output = output << 32;
output += lowInt;
于 2009-07-30T21:22:25.867 に答える
1

エンコーディング:

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

デコード:

uint lo = (uint)(mixed & uint.MaxValue);
uint hi = (uint)(mixed >> 32);
于 2009-07-30T21:46:54.617 に答える