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

  • Математическая цепочка оператора сравнения - как и в случае, если ((5 <j <= 1)) "
  • Понимание побитового оператора AND
  • Конструктор преобразования и оператор преобразования: приоритет
  • Java - порядок операций - использование двух операторов присваивания в одной строке
  • Есть ли разница в производительности между ++ i и i ++ в C #?
  • Существуют ли объявляемые имена для обычных операторов Haskell?
  • в чем разница между оператором == и equals ()? (с hashcode () ???)
  • Что означают все символические операторы Scala?
  • (OrElse и Or) и (AndAlso и And) - Когда использовать?
  • Почему ++ считается l-значением, но i ++ - нет?
  • что означает | = (единственная единственная труба) и & = (одиночные амперсанды равны)
  • Interesting Posts

    Извлечение данных между двумя символами в Excel

    Получить значение удаленного реестра

    Цикл через таблицы Excel

    «Npm install» устанавливает все зависимости в каталоге node_modules, вместо того, чтобы иметь вложенные

    Все браузеры невероятно медленны, кроме … оперы?

    Почему большинство пользовательских интерфейсов однопоточных?

    Метод Mongoose .find () вызывает зависание запросов

    Учитывая массив, узнайте следующий меньший элемент для каждого элемента

    Можно ли использовать формулу excel для извлечения ссылки в гиперссылке в ячейке?

    Отображение цветовых профилей после обновления до Windows 8.1

    Как добавить строку в фрейм данных с итоговыми значениями?

    INSERT INTO … SELECT для всех столбцов MySQL

    Использование списков внутри столбцов data.table

    WPF Изменение фонового изображения кнопки при нажатии

    Ограничьте вывод видео в секцию дисплея и оставите пустой

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