Оператор тильды в 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].
Благодарю ..... Пусть это поможет тебе

  • Несколько операций preincrement для переменной в C ++ (C?)
  • Создание логического эксклюзивного или оператора в Java
  • Что делает >> в java?
  • Что значит !! (двойной восклицательный знак) означает?
  • Что означают все символические операторы Scala?
  • Возможно ли создать новый оператор в c #?
  • в чем разница между оператором == и equals ()? (с hashcode () ???)
  • Что делает знак вопроса и точечный оператор?. означает в C # 6.0?
  • Сделать оператор << виртуальным?
  • Что означает $ mean / do в Haskell?
  • ^ оператор в java
  • Interesting Posts

    Как центрировать выравнивание заголовка ActionBar в Android?

    ASP.NET MVC $ .post вызов возвращающей строки … нужна помощь с форматом для jqGrid

    Получить выбранный элемент с помощью флажка в Listview

    Как получить более 1000 строк с Parse.com?

    Сохраните все имена профилей WLAN, хранящиеся на моей машине, в текстовый файл

    Как настроить проигрыватель 7 в качестве маршрутизатора?

    Установите GNU GCC на Mac

    geom_boxplot с предварительно вычисленными значениями

    Неразрушимо Преобразование автономного динамического диска на базовый диск с помощью инструмента testdisk

    Firebase FCM force onTokenRefresh () будет называться

    Windows 7 Sticky Notes для основы для каждой папки

    Как удалить элементы из общего списка во время итерации по нему?

    Evolution на Debian 7 не будет восстанавливать резервный файл Evolution от Fedora 18

    Как подключить Windows 8 Mail, Calendar и People к Exchange Server?

    Lightroom вызывает системную проблему с подключением

    Давайте будем гением компьютера.