2010-08-30 90 views
8

我有一些低級別的圖像/紋理操作,其中32位顏色存儲爲UInt32或int,我需要在兩者之間進行非常快速的按位轉換。最簡單的方法將int轉換爲UInt32按位?

例如

int color = -2451337; 

//exception 
UInt32 cu = (UInt32)color; 

有什麼想法?

感謝和問候

回答

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

不錯!只是我在找什麼..謝謝! – thalm 2010-08-30 14:06:30

7
BitConverter.ToUInt32(BitConverter.GetBytes(-2451337), 0) 
+2

+1以抵消downvote。即使在編輯之前,這個答案也沒有什麼重要的錯誤。事實上,如果使用VB,這將是首選方法,因爲不允許從Int32直接轉換到UInt32和粒度未檢查的上下文。 – 2010-08-30 14:09:26

+0

與UiValue = CUInt(IntValue&0xFFFFFFFF&)類似的性能如何? – supercat 2010-08-30 15:44:29

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位版本將非常相似。我不確定哪種方法會更快。這些轉變有點愚蠢,但他們避免了'如果'測試的需要。

相關問題