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 est de 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;
}
L'opérateur ~
est au niveau du bit PAS , il inverse les bits d'un nombre binaire:
NOT 011100
= 100011
~
est l'opérateur NOT au niveau du bit. Il inverse les bits de l'opérande.
Par exemple, si vous avez:
char b = 0xF0; /* Bits are 11110000 */
char c = ~b; /* Bits are 00001111 */
Il s’agit de l’opérateur PAS au niveau des bits .. .. Il retourne tous les bits d’un nombre: 100110 -> 011001
Le caractère tilde est utilisé en tant qu'opérateur pour inverser tous les bits d'un entier (PAS au niveau du bit).
Par exemple: ~0x0044 = 0xFFBB
.
C'est l'opérateur bitwise PAS. Il inverse tous les bits d'une valeur entière.
L'opérateur tilde (~) aussi appelé opérateur NOT au niveau du bit, exécute comme complément son complément de tout nombre binaire. Si l'opérande à NOT est un nombre décimal, il le convertit en binaire et effectue l'opération du complément.
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é en opération de masquage. Masquer signifie définir et réinitialiser les valeurs à l'intérieur d'un registre. pour ex:
char mask ;
mask = 1 << 5 ;
Il définira masque sur une valeur binaire de 10 000 et ce masque peut être utilisé pour vérifier la valeur de bit présente dans une autre variable.
int a = 4;
int k = a&mask ; if the 5th bit is 1 , then k=1 otherwise k=0.
Ceci s'appelle Masking of bits . 2.Pour trouver l'équivalent binaire d'un nombre quelconque à l'aide des propriétés de masquage.
#include<stdio.h>
void equi_bits(unsigned char);
int main()
{
unsigned char num = 10 ;
printf("\nDecimal %d is same as binary ", num);
equi_bits(num);
return 0;
}
void equi_bits(unsigned char n)
{
int i ;
unsigned char j , k ,mask ;
for( i = 7 ; i >= 0 ; i--)
{
j=i;
mask = 1 << j;
k = n&mask ; // Masking
k==0?printf("0"):printf("1");
}
}
Sortie: le nombre décimal 10 est identique à 00001010
Mon observation: pour la plage maximale de tout type de données, son complément 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
#include<stdio.h>
int main()
{
int a , b;
a=10;
b=~a; // b-----> -11
printf("%d\n",a+~b+1);// equivalent to a-b
return 0;
}
Output: 0
Remarque: Ceci n'est valable que pour la plage de types de données. moyen pour int type de données 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