2つのuintをc#のulongに結合し、高/低のuintを設定する最適な方法は何ですか?2つのuintをcのulongに結合する最良の方法は何ですか#
私はbitshiftingがそれを行うことができると知っていますが、私は構文やBitConverterのような他のAPIを知らないかもしれませんが、私は何をしたいのか分からない。
2つのuintをc#のulongに結合し、高/低のuintを設定する最適な方法は何ですか?2つのuintをcのulongに結合する最良の方法は何ですか#
私はbitshiftingがそれを行うことができると知っていますが、私は構文やBitConverterのような他のAPIを知らないかもしれませんが、私は何をしたいのか分からない。
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
ulong output = (ulong)highUInt << 32 + lowUInt
それぞれ左(より高い)と(下)、右へ<<
と>>
演算子ビットシフト。 highUInt << 32
は機能的にはhighUInt * Math.Pow(2, 32)
と同じですが、より高速で(IMO)簡単な構文です。
それは間違っています。 'highInt'が' uint'なら 'highInt << 32 == highInt'です。 –
ありがとう、キャストを追加しました。 –
あなたがビットシフトする前に、ULONGにhighIntを変換する必要があります。
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);
ちょうど好奇心から、キャストはなぜ必要ですか? – LiraNuna
もしhighがちょうどintであれば、high << 32はすべて0になります。なぜなら、すべての変数を変数から完全にシフトしたからです。シフトを開始する前に64ビット整数*にする必要があります。 –
Aric: "変数のすべてを完全に変数から外しました"これは完全に真実ではありません。私の更新された答えをお読みください。 –