9

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

例如

 int color = -2451337;  

 //exception
 UInt32 cu = (UInt32)color;

有任何想法吗?

谢谢并恭祝安康

4

3 回答 3

24
int color = -2451337;
unchecked {
    uint color2 = (uint)color;
    // color2 = 4292515959
}
于 2010-08-30T13:46:18.260 回答
10
BitConverter.ToUInt32(BitConverter.GetBytes(-2451337), 0)
于 2010-08-30T13:43:15.147 回答
0

那些使用像 VB 这样的语言的人,在转换过程中没有一种非常方便的方法来禁用溢出检查,可以使用类似的东西:

    共享函数 unsToSign64(ByVal val As UInt64) As Int64
        If (val And &H80000000000000000UL) 0 Then 返回 CLng(val Xor &H8000000000000000UL) Xor &H8000000000000000 否则返回 CLng(val)
    结束功能
    共享函数 signToUns64(ByVal val As Int64) As UInt64
        If val < 0 Then Return CULng(val Xor &H8000000000000000) Xor &H8000000000000000UL 否则返回 CULng(val)
    结束功能

或者

    共享函数 unsToSign(ByVal val As UInt64) As Int64
        返回 CLng(val And &H7FFFFFFFFFFFFFFFUL) + (CLng(-((val And &H80000000000000000UL) >> 1)) << 1)
    结束功能
    共享函数 signToUns(ByVal val As Int64) As UInt64
        返回 CULng(val And &H7FFFFFFFFFFFFFFF) + (CULng(-((val And &H8000000000000000) >> 1)) << 1)
    结束功能

32 位的版本将非常相似。我不确定哪种方法会更快。这些转变有点傻,但它们避免了“if”测试的需要。

于 2010-08-30T16:18:06.553 回答