Оператор тильды в C

Я видел оператора тильды, используемого в алгоритме hashирования 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 <> 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] Ex: 0101 = 5; ~ (0101) = 1010. Использование оператора тильды: 1. Используется при маскировке, настройка маскировки и сброс значений внутри любого регистра. например:

 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 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 до любого соответствующего значения. например:
~ 1 --------> -2
~ 2 ---------> -3
и так далее ... Я покажу вам это наблюдение, используя небольшой fragment кода

 #include int main() { int a , b; a=10; b=~a; // b-----> -11 printf("%d\n",a+~b+1);// equivalent to ab return 0; } Output: 0 

Примечание. Это допустимо только для диапазона типов данных. для типа данных int это правило будет применяться только для значения диапазона [-2,147,483,648 до 2,147,483,647].
Благодарю ..... Пусть это поможет тебе

  • Глобальная перегрузка операторов в F #
  • Почему операторам Java + =, - =, * =, / = сложного присваивания не требуется кастинг?
  • Разница между & и && в Java?
  • Несколько операций preincrement для переменной в C ++ (C?)
  • Создание логического эксклюзивного или оператора в Java
  • В чем разница между оператором dot (.) И -> в C ++?
  • Почему компиляторы C ++ не определяют operator == и operator! =?
  • Вставить vs emplace vs operator в c ++ map
  • Каковы операторы Pointer-to-Member -> * и. * В C ++?
  • Операция XOR с двумя строками в java
  • Haskell: Как произносится ?
  • Давайте будем гением компьютера.