ما هي أفضل طريقة للجمع بين اثنين من uint في ulong في c#
سؤال
ما هي أفضل طريقة للجمع بين اثنين من uint في ulong في C#، وضع العلامات العالية/المنخفضة.
أعلم أن bitshifting يمكن أن تفعل ذلك ، لكنني لا أعرف بناء الجملة ، أو ربما هناك واجهات برمجة التطبيقات الأخرى للمساعدة مثل BitConverter ، لكنني لا أرى طريقة تفعل ما أريد.
المحلول
ulong mixed = (ulong)high << 32 | low;
الممثلين مهم جدا. إذا حذفت الممثلين ، بالنظر إلى حقيقة ذلك high
من النوع uint
(وهو 32 بت) ، ستحول قيمة 32 بت 32 بت إلى اليسار. سوف تستخدم مشغلات التحويل على 32 بت متغيرات Shift right-hand-side
وزارة الدفاع 32. بفعالية ، تحويل أ uint
32 بت إلى اليسار هو عدم وجود op. صب ل 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
ال <<
و >>
المشغلين bitshift إلى اليسار (أعلى) واليمين (أقل) ، على التوالي. 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);