我有一些低級別的圖像/紋理操作,其中32位顏色存儲爲UInt32或int,我需要在兩者之間進行非常快速的按位轉換。最簡單的方法將int轉換爲UInt32按位?
例如
int color = -2451337;
//exception
UInt32 cu = (UInt32)color;
有什麼想法?
感謝和問候
我有一些低級別的圖像/紋理操作,其中32位顏色存儲爲UInt32或int,我需要在兩者之間進行非常快速的按位轉換。最簡單的方法將int轉換爲UInt32按位?
例如
int color = -2451337;
//exception
UInt32 cu = (UInt32)color;
有什麼想法?
感謝和問候
int color = -2451337;
unchecked {
uint color2 = (uint)color;
// color2 = 4292515959
}
BitConverter.ToUInt32(BitConverter.GetBytes(-2451337), 0)
+1以抵消downvote。即使在編輯之前,這個答案也沒有什麼重要的錯誤。事實上,如果使用VB,這將是首選方法,因爲不允許從Int32直接轉換到UInt32和粒度未檢查的上下文。 – 2010-08-30 14:09:26
與UiValue = CUInt(IntValue&0xFFFFFFFF&)類似的性能如何? – supercat 2010-08-30 15:44:29
那些使用如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位版本將非常相似。我不確定哪種方法會更快。這些轉變有點愚蠢,但他們避免了'如果'測試的需要。
不錯!只是我在找什麼..謝謝! – thalm 2010-08-30 14:06:30