wake-up-neo.com

Der Tilde-Operator in C

Ich habe den Tilde-Operator gesehen, der im ELF-Hash-Algorithmus verwendet wird. (Der Code ist von 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

Der ~-Operator ist bitweise NICHT , er invertiert die Bits in eine Binärzahl:

NOT 011100
  = 100011
116
GWW

~ ist der bitweise NOT-Operator. Es invertiert die Bits des Operanden.

Zum Beispiel, wenn Sie:

char b = 0xF0;  /* Bits are 11110000 */
char c = ~b;    /* Bits are 00001111 */
41
dlev

Dies ist der bitweise NOT-Operator ..__, der alle Bits einer Zahl umschaltet: 100110 -> 011001

11
immortal

Das Tilde-Zeichen wird als Operator verwendet, um alle Bits einer Ganzzahl zu invertieren (bitweise NOT).

Zum Beispiel: ~0x0044 = 0xFFBB.

7
Cedekasme

Es ist der bitweise NOT-Operator. Es invertiert alle Bits in einem ganzzahligen Wert.

7

Tilde-Operator (~) auch bitweiser NOT-Operator genannt, führt das Komplement aus einer beliebigen Binärzahl als Argument. Wenn der Operand für NOT eine Dezimalzahl ist, konvertiert er ihn als binär und führt eine Komplementoperation aus.

Um ein Komplement zu berechnen, invertieren Sie einfach alle Ziffern [0 -> 1] und [1 -> 0] Ex: 0101 = 5; ~ (0101) = 1010 . Verwendung des Tilde-Operators: 1. Es wird im Maskierungsbetrieb verwendet. Maskierung bedeutet, die Werte in einem beliebigen Register festzulegen und zurückzusetzen. zum Beispiel: 

char mask ;
mask = 1 << 5 ;

Die Maske wird auf einen binären Wert von 10000 gesetzt. Mit dieser Maske kann der in einer anderen Variablen vorhandene Bitwert überprüft werden. 

int a = 4;
int k = a&mask ; if the 5th bit is 1 , then k=1 otherwise k=0. 

Dies wird als Masking von Bits ..__ bezeichnet. 2.Um eine binäre Entsprechung einer beliebigen Zahl mithilfe von Maskierungseigenschaften zu finden.

#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");
  }  
}

Ausgabe: Dezimal 10 entspricht 00001010

Meine Beobachtung : Für die maximale Reichweite eines beliebigen Datentyps wird der negative Wert um 1 auf den entsprechenden Wert verringert. Ex:
~ 1 --------> -2
~ 2 ---------> -3
und so weiter ... Ich werde Ihnen diese Beobachtung mit einem kleinen Code-Snippet zeigen

#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

Anmerkung: Dies gilt nur für den Datentypbereich. Für den Datentyp int bedeutet diese Regel nur für den Wert von range [-2.147.483.648 bis 2.147.483.647].
Danke ..... Möge dir das helfen

0
Prakash Sharma