2011-08-26 12 views
79

Ho visto l'operatore tilde utilizzato nell'algoritmo di hashing ELF e sono curioso di sapere cosa fa. (Il codice è from Eternally Confused.)L'operatore tilde in C

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; 
} 

risposta

105

L'operatore ~ è bit per bit NOT, inverte i bit in un numero binario:

NOT 011100 
    = 100011 
+0

Quale scopo servirebbe? Ho sentito che potresti usarlo in unsigned -> signed conversion ma non vedo come? – MarcusJ

+1

Bitwise NOT è utile per un numero di cose, ad esempio maschere di bit. Non sono sicuro di cosa intendi con la conversione di interi senza segno. – GWW

+2

Aspetta, non dovresti AND la maschera di bit? è così che il mio lettore di bit lo sta facendo, ma è permaloso. Ho letto che se hai X e NON lo è, quindi sottrai uno otterrai la versione senza firma di un numero firmato, non è corretto? – MarcusJ

38

~ è il NOT bit a bit dell'operatore. Inverte i bit dell'operando.

Ad esempio, se si dispone di:

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

Questo è il NOT bit a bit dell'operatore. Si capovolge tutti i bit in un numero: 100110 -> 011.001

7

E 'il NOT bit a bit dell'operatore. Inverte tutti i bit in un valore intero.

7

Il carattere di tilde viene utilizzato come operatore per invertire tutti i bit di un intero (NOT bit a bit).

Ad esempio: ~0x0044 = 0xFFBB.

0

operatore tilde (~) anche chiamato NOT bit a bit operatore, effettua complemento a uno di qualsiasi numero binario come argomento. Se l'operando su NOT è un numero decimale, lo converte come binario e compie l'operazione di complemento.

Per calcolare il proprio complemento è sufficiente invertire tutte le cifre [0 -> 1] e [1 -> 0] Es: 0101 = 5; ~ (0101) = 1010. Uso dell'operatore di tilde: 1. Viene utilizzato nell'operazione di mascheramento. Mascheratura indica l'impostazione e il ripristino dei valori all'interno di qualsiasi registro. es:

char mask ; 
mask = 1 << 5 ; 

fisserà maschera per un valore binario di 10000 e questa maschera può essere utilizzato per controllare il valore del bit presente all'interno altra variabile.

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

Questo è chiamato mascheratura di bit. 2.Per trovare l'equivalente binario di qualsiasi numero utilizzando le proprietà di mascheramento.

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

uscita: decimale 10 è uguale 00001010

mia osservazione: Per la portata massima di qualsiasi tipo di dati, un complemento forniscono il valore negativo diminuito di 1 a qualsiasi valore corrispondente. ~ 1 --------> -2
~ 2 ---------> -3
e così via ... Ti mostrerò questa osservazione usando un piccolo codice snippet

#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 

Nota: questo è valido solo per il tipo di dati. significa per tipo di dati int questa regola sarà applicabile solo per il valore dell'intervallo [-2.147.483.648 a 2.147.483.647].
Grazie .....Che questo ti aiuti

Problemi correlati