Dupliquer possible:
Quel est le tilde (~) dans une énumération C #?
J'ai trouvé le bit de code suivant sur une page this MSDN.
(((Width * Planes * BitCount + 31) & ~31) / 8) * abs(Height)
Cela compile bien dans C # visual studio 2010. Que fait exactement le tilde "~" devant le numéro 31? Je n'ai jamais vu cette syntaxe dans une expression auparavant.
C’est l’opérateur bitwise complement , également appelé négation au niveau du bit.
~
- opérateur bit not NOT , inversement des bits
31 au format binaire est 11111, donc ~ 31 == 00000, en gros 0
Vous vous adressez à votre copie pratique de ISO/IEC 23270: 2006 - Technologies de l'information - Langages de programmation - C # et vous reportez au § 14.6.4 de l'écriture sainte. Vous y trouverez:
14.6.4 Opérateur de complément au niveau des bits
Pour une opération de la forme ~ x, la résolution de surcharge unaire par un opérateur (§14.2.3) est appliquée pour sélectionner une implémentation d'opérateur spécifique. L'opérande est converti en type de paramètre de l'opérateur sélectionné et le type du résultat correspond au type de retour de l'opérateur. Les opérateurs de complément au niveau du bit prédéfinis sont:
int operator ~( int x ) ;
uint operator ~( uint x ) ;
long operator ~( long x ) ;
ulong operator ~( ulong x ) ;
Pour chacun de ces opérateurs, le résultat de l'opération est le complément au niveau du bit de x.
Chaque type d'énumération E fournit implicitement l'opérateur de complément au niveau du bit suivant:
E operator ~(E x);
Le résultat de l'évaluation de ~x
, où x
est l'expression d'un type d'énumération E
avec un type sous-jacent U
, est identique à l'évaluation de unchecked((E)(~(U)x))
. Cet opérateur est uniquement pris en compte dans la résolution unitaire de surcharge de l'opérateur lorsque le type d'opérande est le type enum E
(§14.2.3).
Les formes levées (§ 14.2.7) des opérateurs de complément au bit prédéfinis et non définis définis ci-dessus sont également prédéfinies.
Dans votre cas, ~31
est identique à ~ 0x0000001F
. Le complément au niveau du bit de 0x0000001F
est 0xFFFFFFE0
. Pourquoi ils n'écriraient pas le masque qu'ils voulaient me dépasse.
C'est l'opérateur de complément bitwise .
Fondamentalement, il retourne les bits:
0xffff0000 == ~0x0000ffff
Dans le code que vous avez posté, faire & ~31
garantit que les 5 derniers bits sont à 0 (bit à bit et du complément de 11111 qui est 00000).
Il s’agit de l’opérateur complémentaire au niveau du bit - il convertit tous les bits 0 en 1 et vice-versa ... voir Référence MSDN .
Dans votre cas spécifique, il crée simplement (31 = 0x1F
):
~0x1F = 0xFFFFFFE0
Il est utilisé avec bitwise and (&)
et annule donc les 5 derniers bits.
~ 31 = négation au niveau du bit de 31 et dans ce cas particulier est utilisé pour maintenir à zéro les premiers (à partir de LSB) 5 bits de (Width * Planes * BitCount + 31)