Язык C содержит группу операций над целыми числами. Эти операции называются побитовыми, и они чаще встречаются в старых языках программирования. Молодые языки вытесняют побитовые операции на периферию как неинтуитивные.
Операция | Обозначение | Использование |
---|---|---|
И | & | a & b |
Или | | | a | b |
Исключающее или | ^ | a ^ b |
Не | ~ | ~a |
Побитовое «не» — операция с одним аргументом (унарная). Три остальные работают над двумя аргументами — они бинарные.
Смысл
Суть всех побитовых операций схожа. Целые числа a и b представлены в компьютере последовательностями нулей и единиц фиксированной длины (по 32 бита для типа int). Процессор применяет требуемую логическую операцию к соответствующим битам обоих чисел, и кладёт результат в соответствующий бит. Получается новое целое число, являющееся какой-то комбинацией исходных чисел.
Смысл
Суть всех побитовых операций схожа. Целые числа a и b представлены в компьютере последовательностями нулей и единиц фиксированной длины (по 32 бита для типа int). Процессор применяет требуемую логическую операцию к соответствующим битам обоих чисел, и кладёт результат в соответствующий бит. Получается новое целое число, являющееся какой-то комбинацией исходных чисел.a | b | a & b | a | b | a ^ b | ~a |
---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 1 |
0 | 1 | 0 | 1 | 1 | 1 |
1 | 0 | 0 | 1 | 1 | 0 |
1 | 1 | 1 | 1 | 0 | 0 |
Операция «И»: результат будет 1, если и первый, и второй аргумент равен 1.
Операция «Или»: результат будет 1, если первый или второй аргумент равен 1, или если оба.
Операция «Исключающее или»: результат будет 1, если из двух аргументов ровно один равен 1. Либо первый — либо второй, обе единицы не допускаются. Поэтому «исключающее или».
Операция «Не» смотрит только на a (естественно) и выворачивает его наизнанку: 0 переходит в 1, 1 переходит в 0.
Операция «Или»: результат будет 1, если первый или второй аргумент равен 1, или если оба.
Операция «Исключающее или»: результат будет 1, если из двух аргументов ровно один равен 1. Либо первый — либо второй, обе единицы не допускаются. Поэтому «исключающее или».
Операция «Не» смотрит только на a (естественно) и выворачивает его наизнанку: 0 переходит в 1, 1 переходит в 0.
Приоритет
Унарная операция ~ находится на том же приоритете, что и другие унарные операции, вроде ++, !, *.
Остальные три операции находятся каждая на своём приоритете, причём почему-то ниже операций равенства == и !=. Это довольно неудобно, и программистам часто приходится ставить группирующие скобки при использовании побитовых операций.
Зачем нужны побитовые операции?
Три операции, а именно: ~, & и |, активно используются при операциях с битовыми масками. Битовые маски — это числа, сформированные таким образом, чтобы у них была ровно одна 1 в двоичной записи, а все остальные нули. (По секрету, все такие числа — степени двойки.) Несколько битовых масок можно скомбинировать с помощью операции побитового «или», и получить одно целое число. Этот приём был широко распространён во время бума С/С++. Его использовали, чтобы передать по смыслу массив значений «да/нет», только компактно.
Операция ^ в битовых масках не участвовала, её судьба оказалась — работать самым примитивным шифрованием из возможных: если побитово сложить исходное сообщение и ключ, получится нечитаемая человеком каша.
Комментариев нет:
Отправить комментарий