سؤال

لديّ بعض عمليات الصورة/الملمس ذات المستوى المنخفض حيث يتم تخزين الألوان 32 بت على أنها UINT32 أو Int وأحتاج إلى تحويل سريع بالفعل بين الاثنين.

على سبيل المثال

 int color = -2451337;  

 //exception
 UInt32 cu = (UInt32)color;

أيه أفكار؟

شكرا مع تحياتي

هل كانت مفيدة؟

المحلول

int color = -2451337;
unchecked {
    uint color2 = (uint)color;
    // color2 = 4292515959
}

نصائح أخرى

BitConverter.ToUInt32(BitConverter.GetBytes(-2451337), 0)

أولئك الذين يستخدمون لغة مثل VB ، والتي لا تملك طريقة مريحة حقًا لتعطيل اختبارات الفائض أثناء التحويل ، يمكنهم استخدام شيء مثل:

    Shared Function unsToSign64(ByVal val As UInt64) As Int64
        If (val And &H8000000000000000UL)  0 Then Return CLng(val Xor &H8000000000000000UL) Xor &H8000000000000000 Else Return CLng(val)
    End Function
    Shared Function signToUns64(ByVal val As Int64) As UInt64
        If val < 0 Then Return CULng(val Xor &H8000000000000000) Xor &H8000000000000000UL Else Return CULng(val)
    End Function

أو

    Shared Function unsToSign(ByVal val As UInt64) As Int64
        Return CLng(val And &H7FFFFFFFFFFFFFFFUL) + (CLng(-((val And &H8000000000000000UL) >> 1)) << 1)
    End Function
    Shared Function signToUns(ByVal val As Int64) As UInt64
        Return CULng(val And &H7FFFFFFFFFFFFFFF) + (CULng(-((val And &H8000000000000000) >> 1)) << 1)
    End Function

ستكون إصدارات 32 بت متشابهة جدًا. لست متأكدًا من الطريقة التي ستكون أسرع. التحولات سخيفة بعض الشيء ، لكنها تتجنب حاجة إلى اختبارات "إذا".

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top