J'ai vu l'opérateur tilde utilisé dans l'algorithme de hachage ELF, et je suis curieux de savoir ce qu'il fait. (Le code vient d'Eternally Confused .)
unsigned elf_hash ( void *key, int len )
{
unsigned char *p = key;
unsigned h = 0, g;
int i;
for ( i = 0; i < len; i++ ) {
h = ( h << 4 ) + p[i];
g = h & 0xf0000000L;
if ( g != 0 )
h ^= g >> 24;
h &= ~g;
}
return h;
}
~
est également appelée «complément à un», qui est une forme de négation binaire. Pratiquement tous les ordinateurs modernes utilisent l'arithmétique du complément à deux, qui est l'inverse au niveau du bit, plus un. Donc, pour une variable entière signéex
, vous trouverez généralement que cela~x + 1
donne la même valeur que-x
. Par exemple,printf("%hx %hx\n", -1234, ~1234 + 1)
imprimefb2e fb2e
sur ma machine.~
est l'opérateur NOT au niveau du bit. Il inverse les bits de l'opérande.Par exemple, si vous avez:
la source
Il s'agit de l'opérateur NOT au niveau du bit. Il retourne tous les bits dans un nombre: 100110 -> 011001
la source
Le caractère tilde est utilisé comme opérateur pour inverser tous les bits d'un entier (NON au niveau du bit).
Par exemple:
~0x0044 = 0xFFBB
.la source
C'est l'opérateur NOT au niveau du bit. Il inverse tous les bits dans une valeur entière.
la source
L'opérateur Tilde (~) également appelé opérateur NOT au niveau du bit, effectue son complément de n'importe quel nombre binaire comme argument. Si l'opérande NOT est un nombre décimal, il le convertit en binaire et effectue l'opération de complément à un.
Pour calculer son complément, il suffit d'inverser tous les chiffres [0 -> 1] et [1 -> 0] Ex: 0101 = 5; ~ (0101) = 1010. Utilisation de l'opérateur tilde: 1. Il est utilisé dans l'opération de masquage, le masquage signifie la définition et la réinitialisation des valeurs à l'intérieur de n'importe quel registre. par ex:
Il définira le masque sur une valeur binaire de 10000 et ce masque peut être utilisé pour vérifier la valeur de bit présente dans une autre variable.
C'est ce qu'on appelle le masquage des bits. Pour trouver l'équivalent binaire de n'importe quel nombre en utilisant les propriétés de masquage.
Sortie: le décimal 10 est identique à 00001010
Mon observation : pour la plage maximale de tout type de données, le complément à un fournit la valeur négative diminuée de 1 à toute valeur correspondante. ex:
~ 1 --------> -2
~ 2 ---------> -3
et ainsi de suite ... Je vais vous montrer cette observation en utilisant un petit extrait de code
Remarque: Ceci n'est valable que pour la plage de types de données. signifie que pour le type de données int, cette règle ne sera applicable que pour la valeur de la plage [-2 147 483 648 à 2 147 483 647].
Merci ..... Que cela vous aide
la source