He visto el operador de tilde utilizado en el algoritmo de hash ELF, y tengo curiosidad por saber qué hace. (El código es 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;
}
~
también se llama "complemento a uno", que es una forma de negación binaria. Prácticamente todas las computadoras modernas usan aritmética en complemento a dos, que es la inversa bit a bit, más uno. Entonces, para una variable entera con signox
, normalmente encontrará que~x + 1
da el mismo valor que-x
. Por ejemplo,printf("%hx %hx\n", -1234, ~1234 + 1)
imprimefb2e fb2e
en mi máquina.~
es el operador NOT bit a bit. Invierte los bits del operando.Por ejemplo, si tiene:
fuente
Este es el operador NOT bit a bit. Voltea todos los bits en un número: 100110 -> 011001
fuente
El carácter de tilde se utiliza como operador para invertir todos los bits de un entero (NOT bit a bit).
Por ejemplo:
~0x0044 = 0xFFBB
.fuente
Es el operador NOT bit a bit. Invierte todos los bits en un valor entero.
fuente
El operador Tilde (~) también llamado operador NOT bit a bit, realiza el complemento de cualquier número binario como argumento. Si el operando NOT es un número decimal, lo convierte en binario y realiza la operación de complemento a uno.
Para calcular el complemento a uno, simplemente invierta todos los dígitos [0 -> 1] y [1 -> 0] Ej: 0101 = 5; ~ (0101) = 1010. Uso del operador de tilde: 1. Se utiliza en la operación de enmascaramiento. Enmascarar significa establecer y restablecer los valores dentro de cualquier registro. por ejemplo:
Establecerá la máscara en un valor binario de 10000 y esta máscara se puede usar para verificar el valor de bit presente dentro de otra variable.
Esto se llama Enmascaramiento de bits. 2. Encontrar el equivalente binario de cualquier número usando propiedades de enmascaramiento.
Salida: el decimal 10 es igual que 00001010
Mi observación : para el rango máximo de cualquier tipo de datos, el complemento a uno proporciona el valor negativo disminuido en 1 a cualquier valor correspondiente. ej .:
~ 1 --------> -2
~ 2 ---------> -3
y así sucesivamente ... Le mostraré esta observación usando un pequeño fragmento de código
Nota: esto es válido solo para el rango de tipo de datos. significa que 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 te ayude
fuente