forma más rápida de fundición int a UInt32 bit a bit?
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
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