9
votes

Le moyen le plus rapide de jeter int to uint32 bittwise?

J'ai des opérations d'image / de texture de faible niveau où les couleurs 32 bits sont stockées comme UINT32 ou INT et j'ai besoin d'une conversion bit dans le sens très rapide entre les deux.

EG P>

 int color = -2451337;  

 //exception
 UInt32 cu = (UInt32)color;


0 commentaires

3 Réponses :


10
votes
BitConverter.ToUInt32(BitConverter.GetBytes(-2451337), 0)

2 commentaires

+1 pour compenser le bowvote. Même avant mon édition, il n'y avait rien d'importance vitale qui ne va pas avec cette réponse. En fait, ce serait la méthode privilégiée si vous utilisez VB puisque les moulages directs de Int32 aux UINT32 et les contextes granulés non cochés ne sont pas autorisés.


Comment cela se compare-t-il dans la performance avec quelque chose comme Utivalue = Cuint (Intvalue & 0xFFFFFFFFF &)?



24
votes
int color = -2451337;
unchecked {
    uint color2 = (uint)color;
    // color2 = 4292515959
}

0 commentaires

0
votes

Ceux qui utilisent une langue comme VB, qui n'ont pas un moyen vraiment pratique de désactiver les contrôles de débordement pendant la conversion, pourraient utiliser quelque chose comme: xxx pré>

ou p>

    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


0 commentaires