modo più veloce per getto int UInt32 bit per bit?
Domanda
ho alcune operazioni di immagine / texture di basso livello in cui i colori a 32 bit vengono memorizzati come UInt32 o int e ho bisogno di una conversione molto veloce bit a bit tra i due.
per es.
int color = -2451337;
//exception
UInt32 cu = (UInt32)color;
tutte le idee?
Grazie e saluti
Soluzione
int color = -2451337;
unchecked {
uint color2 = (uint)color;
// color2 = 4292515959
}
Altri suggerimenti
BitConverter.ToUInt32(BitConverter.GetBytes(-2451337), 0)
Coloro che utilizzano un linguaggio come VB, che non hanno un modo davvero conveniente di Disabilitazione dei controlli di overflow durante la conversione, potrebbe usare qualcosa come:
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
Le versioni per 32 bit sarebbe molto simile. Non sono sicuro di quale approccio sarebbe più veloce. I turni sono un po 'sciocco, ma evitano la necessità di 'se' i test.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow