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;
}
83
demandé sur Paul Manta 2011-08-26 19:53:28

6 réponses

L'opérateur ~ est binaire Pas , Il inverse les bits dans un nombre binaire:

NOT 011100
  = 100011
114
répondu GWW 2011-08-26 15:54:28

~ 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 */
40
répondu dlev 2011-08-26 15:54:25

C'est l'opérateur bitwise NOT. Il retourne tous les bits dans un nombre: 100110 - > 011001

11
répondu immortal 2011-08-26 15:54:26

C'est l'opérateur bitwise NOT. Il inverse tous les bits dans une valeur entière.

7
répondu Sander De Dycker 2011-08-26 15:54:36

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.

7
répondu Cedekasme 2011-08-26 15:57:37

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

0
répondu Prakash Sharma 2017-03-07 04:08:18