我有其中32位的颜色被存储为UInt32的或者int一些低级别图像/纹理操作,我需要两者之间的非常快逐位转换。

e.g。

 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位版本将是非常相似的。我不知道哪种方法会更快。的移位是愚蠢一点,但它们避免需要“如果”测试。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top