2011-08-26 6 views
79

He visto el operador de tilde utilizado en el algoritmo de hash ELF, y tengo curiosidad por saber qué hace. (El código es from Eternally Confused.)El operador de tilde en 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; 
} 

Respuesta

105

El operador ~ es bit a bit NOT, que invierte los bits de un número binario:

NOT 011100 
    = 100011 
+0

¿Para qué sirve esto? Escuché que podrías usarlo en una sesión firmada sin firmar pero no veo cómo? – MarcusJ

+1

Bitwise NOT es útil para varias cosas, por ejemplo, máscaras de bits. No estoy seguro de lo que quiere decir con la conversión de entero sin signo a la firma. – GWW

+2

Espera, ¿no se supone que debes Y la máscara de bits? así es como mi lector de bit lo está haciendo, pero es delicado. He leído que si tiene X y NO, resta uno y obtendrá la versión sin firmar de un número firmado, ¿no es correcto? – MarcusJ

38

~ es el bit a bit NO operador. Invierte los bits del operando.

Por ejemplo, si usted tiene:

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

Este es el bit a bit NO operador. Se voltea todos los bits de un número: 100110 -> 011001

7

Es el bit a bit NO operador. Invierte todos los bits en un valor entero.

7

El carácter de tilde se utiliza como operador para invertir todos los bits de un entero (NO a nivel de bit).

Por ejemplo: ~0x0044 = 0xFFBB.

0

operador tilde (~) también llamado bit a bit NO operador, realiza de un complemento de cualquier número binario como argumento. Si el operando a NOT es un número decimal, entonces lo convierte como binario y realiza una operación de complemento.

Para calcular el complemento, simplemente invierta todos los dígitos [0 -> 1] y [1 -> 0] Ej: 0101 = 5; ~ (0101) = 1010. Uso del operador de tilde: 1. Se usa en la operación de enmascaramiento. Enmascarar significa configurar y restablecer los valores dentro de cualquier registro. para ex:

char mask ; 
mask = 1 << 5 ; 

Fijará máscara a un valor binario de 10000 y esta máscara se puede utilizar para comprobar el valor del bit presente en el interior otra variable.

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

Esto se llama Masking de bits. 2. Para encontrar el equivalente binario de cualquier número usando propiedades de enmascaramiento.

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

de salida: Decimal 10 es el mismo que 00.001.010

Mi observación: Para la gama máxima de cualquier tipo de datos, uno de complemento proporcionar el valor negativo disminuido en 1 a cualquier valor correspondiente. ex:
~ 1 --------> -2
~ 2 ---------> -3
y así sucesivamente ... Les mostraré esta observación utilizando un código pequeño 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: Esto es válido solo para el rango de tipo de datos. significa para el tipo de datos int esta regla será aplicable solo para el valor del rango [-2,147,483,648 a 2,147,483,647].
Gracias .....Que esto lo ayude