i имеет несколько низкоуровневых операций с изображениями / текстурами, где 32-битные цвета хранятся как UInt32 или int, и мне нужно действительно быстрое побитовое преобразование между ними.
Например,
int color = -2451337;
//exception
UInt32 cu = (UInt32)color;
Есть идеи?
Спасибо и с уважением
int color = -2451337;
unchecked {
uint color2 = (uint)color;
// color2 = 4292515959
}
BitConverter.ToUInt32(BitConverter.GetBytes(-2451337), 0)
Те, кто использует такой язык, как VB, который не имеет действительно удобного способа отключения проверки переполнения во время преобразования, могут использовать что-то вроде:
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
или
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
Версии для 32 бит было бы очень похоже. Я не уверен, какой подход будет быстрее. Сдвиги немного глупые, но они позволяют избежать проверки «если».