Самый быстрый способ привести int к UInt32 поразрядно? - PullRequest
8 голосов
/ 30 августа 2010

У меня есть несколько низкоуровневых операций с изображениями / текстурами, где 32-битные цвета хранятся как UInt32 или int, и мне нужно действительно быстрое побитовое преобразование между ними.

, например

 int color = -2451337;  

 //exception
 UInt32 cu = (UInt32)color;

есть идеи?

спасибо и всего наилучшего

Ответы [ 3 ]

21 голосов
/ 30 августа 2010
int color = -2451337;
unchecked {
    uint color2 = (uint)color;
    // color2 = 4292515959
}
8 голосов
/ 30 августа 2010
BitConverter.ToUInt32(BitConverter.GetBytes(-2451337), 0)
0 голосов
/ 30 августа 2010

Те, кто использует такой язык, как 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 бит будут очень похожи.Я не уверен, какой подход будет быстрее.Изменения немного глупы, но они избегают необходимости тестов «если».

...