Самый быстрый способ приведения int к UInt32 побитовым

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

Например,

 int color = -2451337;  

 //exception
 UInt32 cu = (UInt32)color;

Есть идеи?

Спасибо и с уважением

8
задан thalm 30 August 2010 в 13:41
поделиться

3 ответа

int color = -2451337;
unchecked {
    uint color2 = (uint)color;
    // color2 = 4292515959
}
21
ответ дан 5 December 2019 в 05:43
поделиться
BitConverter.ToUInt32(BitConverter.GetBytes(-2451337), 0)
8
ответ дан 5 December 2019 в 05:43
поделиться

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

0
ответ дан 5 December 2019 в 05:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: