c++ - para - El operador de tilde en C
imprimir caracteres especiales en c (6)
El caracter de tilde se usa como un operador para invertir todos los bits de un entero (NO a nivel de bit).
Por ejemplo: ~0x0044 = 0xFFBB
.
He visto el operador de tilde utilizado en el algoritmo 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;
}
El operador ~
es a nivel de bit NOT , invierte los bits en un número binario:
NOT 011100
= 100011
El operador Tilde (~) también llamado operador bit a bit NOT, realiza el 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 todo el dígito [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. por ejemplo:
char mask ;
mask = 1 << 5 ;
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.
int a = 4;
int k = a&mask ; if the 5th bit is 1 , then k=1 otherwise k=0.
Esto se llama Enmascaramiento 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");
}
}
Salida: Decimal 10 es lo mismo que 00001010
Mi observación : para el rango máximo de cualquier tipo de datos, el complemento proporciona el valor negativo disminuido en 1 a cualquier valor correspondiente. ex:
~ 1 --------> -2
~ 2 ---------> -3
y así sucesivamente ... Te mostraré esta observación usando un pequeño fragmento de código
#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 te ayude
Es el operador NOT bit a bit. Invierte todos los bits en un valor entero.
Este es el operador NOT bit a bit. Se voltea todos los bits en un número: 100110 -> 011001
~
es el operador NOT bit a bit. Invierte los bits del operando.
Por ejemplo, si tiene:
char b = 0xF0; /* Bits are 11110000 */
char c = ~b; /* Bits are 00001111 */