Eu vi o operador til usado no algoritmo de hashing ELF e estou curioso para saber o que ele faz. (O código é 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;
}
~
também é chamada de "complemento de um", que é uma forma de negação binária. Praticamente todos os computadores modernos usam a aritmética do complemento de dois, que é o inverso bit a bit mais um. Portanto, para uma variável de número inteiro com sinalx
, você normalmente descobrirá que~x + 1
dá o mesmo valor que-x
. Por exemplo,printf("%hx %hx\n", -1234, ~1234 + 1)
imprimefb2e fb2e
na minha máquina.~
é o operador NOT bit a bit. Ele inverte os bits do operando.Por exemplo, se você tem:
fonte
Este é o operador NOT bit a bit. Ele vira todos os bits em um número: 100110 -> 011001
fonte
O caractere til é usado como um operador para inverter todos os bits de um inteiro (NOT bit a bit).
Por exemplo:
~0x0044 = 0xFFBB
.fonte
É o operador NOT bit a bit. Ele inverte todos os bits em um valor inteiro.
fonte
O operador Til (~), também chamado de operador NOT bit a bit, executa o complemento de qualquer número binário como argumento. Se o operando para NÃO for um número decimal, ele o converte em binário e realiza a operação de complemento de um.
Para calcular o complemento de um, basta inverter todos os dígitos [0 -> 1] e [1 -> 0] Ex: 0101 = 5; ~ (0101) = 1010. Uso do operador til: 1. É usado na operação de mascaramento, mascaramento significa definir e redefinir os valores dentro de qualquer registro. por ex:
Ele definirá a máscara para um valor binário de 10000 e esta máscara pode ser usada para verificar o valor do bit presente dentro de outra variável.
Isso é chamado de mascaramento de bits. 2. Encontrar o equivalente binário de qualquer número usando propriedades de mascaramento.
Saída: Decimal 10 é igual a 00001010
Minha observação : para o intervalo máximo de qualquer tipo de dados, o complemento de um fornece o valor negativo diminuído em 1 para qualquer valor correspondente. ex:
~ 1 --------> -2
~ 2 ---------> -3
e assim por diante ... Vou mostrar esta observação usando um pequeno trecho de código
Nota: Isso é válido apenas para o intervalo de tipo de dados. significa que para o tipo de dados int, essa regra será aplicável apenas para o valor do intervalo [-2.147.483.648 a 2.147.483.647].
Obrigado ..... Que isso te ajude
fonte