Question

J'ai des opérations image / texture faible niveau où les couleurs 32 bits sont stockés sous forme UInt32 ou int et je besoin d'une conversion très rapide de bits entre les deux.

par exemple.

 int color = -2451337;  

 //exception
 UInt32 cu = (UInt32)color;

idées?

Merci et salutations

Était-ce utile?

La solution

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

Autres conseils

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

Ceux qui utilisent une langue comme VB, qui n'ont pas vraiment un moyen pratique de désactiver les contrôles de débordement lors de la conversion, pourrait utiliser quelque chose comme:

    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

ou

    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

Les versions pour 32 bits seraient très similaires. Je ne sais pas quelle approche serait plus rapide. Les changements sont un peu stupide, mais ils évitent la nécessité pour les tests « si ».

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top