Ответ 1
Оператор ~
побитовый NOT, он инвертирует биты в двоичном числе:
NOT 011100
= 100011
Я видел оператора тильды, используемого в алгоритме хэширования ELF, и мне любопытно, что он делает. (Код из 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;
}
Оператор ~
побитовый NOT, он инвертирует биты в двоичном числе:
NOT 011100
= 100011
~
является побитовым оператором NOT. Он инвертирует бит операнда.
Например, если у вас есть:
char b = 0xF0; /* Bits are 11110000 */
char c = ~b; /* Bits are 00001111 */
Это побитовый оператор NOT. Он переворачивает все биты в числе: 100110 → 011001
Это побитовый оператор NOT. Он инвертирует все биты в целочисленном значении.
Символ тильды используется как оператор для инвертирования всех битов целого числа (побитовое NOT).
Например: ~0x0044 = 0xFFBB
.
Оператор Тильды (~) также называется побитовым оператором NOT, выполняет одно дополнение любого двоичного числа в качестве аргумента. Если операнд NOT является десятичным числом, он преобразует его как двоичный и выполняет одну операцию дополнения.
Для вычисления одного дополнения просто инвертируйте все цифры [0 → 1] и [1 → 0] Пример: 0101 = 5; ~ (0101) = 1010. Использование оператора тильды: 1. Он используется при маскировке, Masking означает установку и сброс значений внутри любого регистра. для ex:
char mask ;
mask = 1 << 5 ;
Он установит маску на двоичное значение 10000, и эта маска может использоваться для проверки значения бита, присутствующего внутри другой переменной.
int a = 4;
int k = a&mask ; if the 5th bit is 1 , then k=1 otherwise k=0.
Это называется Маскировка бит. 2. Найти бинарный эквивалент любого числа с использованием свойств маскирования.
#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");
}
}
Выход: Десятичная 10 такая же, как 00001010
Мои наблюдения. Для максимального диапазона любого типа данных одно дополнение обеспечивает отрицательное значение, уменьшенное на 1 до любого соответствующего значения.
ex:
~ 1 -------- > -2
~ 2 --------- > -3
и так далее... Я покажу вам это наблюдение, используя небольшой фрагмент кода
#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
Примечание. Это допустимо только для диапазона типов данных. для типа данных int это правило будет применяться только для значения диапазона [-2,147,483,648 до 2,147,483,647].
Спасибо... Может, это поможет вам