2010-08-30 17 views
8

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 a bit muy rápida entre los dos.¿La forma más rápida de convertir int a UInt32 en modo bit?

p. Ej.

int color = -2451337; 

//exception 
UInt32 cu = (UInt32)color; 

¿Alguna idea?

Gracias y saludos

Respuesta

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

¡agradable! justo lo que estaba buscando ... ¡gracias! – thalm

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

+1 para compensar el downvote. Incluso antes de mi edición no había nada de vital importancia en esta respuesta. De hecho, este sería el método preferido si se utiliza VB, ya que no se permiten los cambios directos de Int32 a UInt32 ni los contextos granulares sin marcar. –

+0

¿Cómo se compara eso en el rendimiento con algo como UiValue = CUInt (IntValue & 0xFFFFFFFF &)? – supercat

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 tontos, pero evitan la necesidad de pruebas 'si'.

Cuestiones relacionadas