2010-08-30 7 views
8

Ich habe einige Low-Level-Bild/Textur-Operationen, wo 32-Bit-Farben als UInt32 oder int gespeichert werden und ich brauche eine sehr schnelle bitweise Konvertierung zwischen den beiden.Schnellste Möglichkeit, int int int in UInt32 zu konvertieren?

z.B.

int color = -2451337; 

//exception 
UInt32 cu = (UInt32)color; 

irgendwelche ideen?

Danke und Grüße

Antwort

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

schön! genau das, was ich gesucht habe .. danke !! – thalm

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

+1, um den Downvote auszugleichen. Schon vor meiner Bearbeitung gab es mit dieser Antwort nichts Wesentliches falsch. In der Tat wäre dies die bevorzugte Methode, wenn VB verwendet wird, da direkte Umwandlungen von Int32 zu UInt32 und granulare unkontrollierte Kontexte nicht erlaubt sind. –

+0

Wie vergleicht das in der Leistung mit etwas wie UiValue = CUInt (IntValue & 0xFFFFFFFF &)? – supercat

0

Diejenigen, die eine Sprache wie VB, der Überlauf während der Konvertierung keine wirklich bequeme Möglichkeit haben Kontrollen zu deaktivieren, so etwas wie verwenden:

 
    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 

oder

 
    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 

Versionen für 32 Bits wären sehr ähnlich. Ich bin mir nicht sicher, welcher Ansatz schneller wäre. Die Verschiebungen sind ein wenig albern, aber sie vermeiden die Notwendigkeit für "wenn" Tests.