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

  • Операция XOR с двумя строками в java
  • Нечеткая оценка компилятора отличается для постоянного выражения и другого выражения
  • Почему «оператор void» не вызывается с синтаксисом броска?
  • Почему выражение a = a + b - (b = a) дает предупреждение о точке последовательности в c ++?
  • Поддержка языков для операторов цепного сравнения (x <y <z)
  • В чем разница между «или» и «|» при программировании в xslt?
  • Почему операторам Java + =, - =, * =, / = сложного присваивания не требуется кастинг?
  • Математическая цепочка оператора сравнения - как и в случае, если ((5 <j <= 1)) "
  • Оператор «&&» и «и» в C
  • Оператор VBA «И» оценивает второй аргумент, когда первый является ложным?
  • Глобальная перегрузка операторов в F #
  • Interesting Posts

    Использование прокси в Spring AOP

    Обновление памяти оперативной памяти

    Указанный DSN содержит несоответствие архитектуры между Драйвером и Приложением. ЯВА

    Outlook зависает на электронных письмах с изображениями с неверными сетевыми путями

    Как реализовать stream активности в социальной сети

    У Skype есть комбинация клавиш для переключения между цепочками?

    Как изменить версию SDK?

    Java Calendar.set (Calendar.DAY_OF_WEEK, Calendar.WUNDAY), будет ли он откатываться назад, вперед или неизвестно?

    Какой значок Dropbox предназначен для имени идентификатора значка Overlay?

    Запланировать задание из командной строки Windows?

    Интервал между элементами ListView Android

    Как вводить CSS в элемент управления WebBrowser?

    Есть ли способ сказать surefire пропустить тесты в определенном пакете?

    Формат строк в MySQL: разница между фиксированным и динамическим?

    Что такое аннотация Scala для оптимизации рекурсивной функции хвоста?

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