ما هي أفضل طريقة للجمع بين اثنين من uint في ulong في c#

StackOverflow https://stackoverflow.com/questions/1209439

  •  06-07-2019
  •  | 
  •  

سؤال

ما هي أفضل طريقة للجمع بين اثنين من 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);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top