web-dev-qa-db-fra.com

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 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;
}
85
Paul Manta

L'opérateur ~ est au niveau du bit PAS , il inverse les bits d'un nombre binaire:

NOT 011100
  = 100011
116
GWW

~ 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 */
41
dlev

Il s’agit de l’opérateur PAS au niveau des bits .. .. Il retourne tous les bits d’un nombre: 100110 -> 011001

11
immortal

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.

7
Cedekasme

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

7
Sander De Dycker

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

0
Prakash Sharma