我有一些低级别的图像/纹理操作,其中32位颜色存储为UInt32或int,我需要在两者之间进行非常快速的按位转换。
e.g。
int color = -2451337;
//exception
UInt32 cu = (UInt32)color;
任何想法?
感谢和问候
答案 0 :(得分:21)
int color = -2451337;
unchecked {
uint color2 = (uint)color;
// color2 = 4292515959
}
答案 1 :(得分:8)
BitConverter.ToUInt32(BitConverter.GetBytes(-2451337), 0)
答案 2 :(得分: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位的版本非常相似。我不确定哪种方法会更快。这些变化有点愚蠢,但他们避免了“if”测试的需要。