L'opérateur tilde en C
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 éternellement confus .)
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;
}
6 réponses
~
est l'opérateur bitwise NOT. 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 */
C'est l'opérateur bitwise NOT. Il retourne tous les bits dans un nombre: 100110 - > 011001
C'est l'opérateur bitwise NOT. Il inverse tous les bits dans une valeur entière.
Le caractère tilde est utilisé comme opérateur pour inverser tous les bits d'un entier (pas au niveau du BIT).
Par exemple: ~0x0044 = 0xFFBB
.
Opérateur Tilde ( ~ ) aussi appelé opérateur bit à bit Non, 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 son opération de complément.
Pour calculer un complément simplement 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, masquage signifie définir et réinitialiser les valeurs à l'intérieur de tout inscrire . pour ex:
char mask ;
mask = 1 << 5 ;
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 .
int a = 4;
int k = a&mask ; if the 5th bit is 1 , then k=1 otherwise k=0.
Ceci est appelé Masquage de bits. 2.To trouvez l'équivalent binaire de n'importe quel nombre en utilisant les 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: 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 à tout 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 type de données. moyenne 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