Frage

Ich habe einige niedrige Niveau Bild / Textur Operationen, bei denen 32-Bit-Farben gespeichert werden als UInt32 oder int und ich brauche eine wirklich schnelle bitweise Konvertierung zwischen den beiden.

z.

 int color = -2451337;  

 //exception
 UInt32 cu = (UInt32)color;

irgendwelche Ideen?

Danke und Grüße

War es hilfreich?

Lösung

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

Andere Tipps

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

Diejenigen, die eine Sprache wie VB, die nicht über eine wirklich bequeme Möglichkeit der Deaktivierung Überlauf überprüft während der Konvertierung 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ürden sehr ähnlich sein. Ich bin mir nicht sicher, welche schneller wäre nähern. Die Verschiebungen sind ein wenig albern, aber sie die Notwendigkeit, ‚wenn‘ Tests vermeiden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top