Оператор тильды в 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; }
- Почему ++ считается l-значением, но i ++ - нет?
- Можно ли получить указатель на функцию встроенного стандартного оператора?
- Возможно ли создать новый оператор в c #?
- Каковы основные правила и идиомы для перегрузки оператора?
- Сделать оператор << виртуальным?
- Разница между ++ Var и Var ++
- ^ оператор в java
- Что такое операторы бит-сдвига (бит-сдвиг) и как они работают?
- Как различаются операторы сравнения с равенством равенства (== double equals) и идентичности (=== triple equals)?
- Невозможно ли применить оператор == к родовым типам в C #?
- Конструктор преобразования и оператор преобразования: приоритет
- Понимание побитового оператора AND
- Что означает «| =»? (оператор равных труб)
Оператор ~
побитовым 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].
Благодарю ..... Пусть это поможет тебе