Pregunta

Tengo algunas operaciones de imagen / textura de bajo nivel donde los colores de 32 bits se almacenan como UInt32 o int y necesito una conversión muy rápido bit a bit entre los dos.

por ejemplo.

 int color = -2451337;  

 //exception
 UInt32 cu = (UInt32)color;

alguna idea?

Gracias y saludos

¿Fue útil?

Solución

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

Otros consejos

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

Los que utilizan un lenguaje como VB, que no tienen una forma muy conveniente de deshabilitar comprobaciones de desbordamiento durante la conversión, podría usar algo como:

    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

o

    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

Las versiones para 32 bits serían muy similares. No estoy seguro de qué enfoque sería más rápido. Los cambios son un poco tonto, pero evitan la necesidad de 'si' pruebas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top