9

32ビットカラーがUInt32またはintとして格納される低レベルの画像/テクスチャ操作があり、2つの間のビット単位の変換が非常に高速である必要があります。

例えば

 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&H8000000000000000UL)0 Then Return CLng(val Xor&H8000000000000000UL)Xor&H8000000000000000 Else Return CLng(val)
    終了機能
    共有関数signToUns64(ByVal val As Int64)As UInt64
        If val <0 Then Return CULng(val Xor&H8000000000000000)Xor&H8000000000000000UL Else Return CULng(val)
    終了機能

また

    共有関数unsToSign(ByVal val As UInt64)As Int64
        CLng(val And&H7FFFFFFFFFFFFFFFUL)+(CLng(-((val And&H8000000000000000UL)>> 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 に答える