我有一些低级图像/纹理操作,其中 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 这样的语言的人,在转换过程中没有一种非常方便的方法来禁用溢出检查,可以使用类似的东西:
共享函数 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”测试的需要。