побитовое OperaТоры в C: AND, OR, XOR, Shift & Дополнить
⚡ Умное резюме
В языке C побитовые операторы манипулируют данными на уровне отдельных битов, используя операции И, ИЛИ, Исключающее ИЛИ, дополнение и сдвиг над целочисленными операндами для выполнения более быстрых вычислений, упаковки флагов и управления оборудованием в низкоуровневом и встроенном программировании.

Что такое побитовые OperaТорс?
побитовое OperaПобитовые операции используются для манипулирования данными на битовом уровне, также называемом побитовым программированием. Побитовые операции работают с одним или несколькими битовыми шаблонами или двоичными числами на уровне их отдельных битов. Они используются в численных вычислениях для ускорения процесса вычислений.
Ниже приведен список побитовых операторов, предоставляемых языком программирования C:
| оператор | Смысл |
|---|---|
| & | Побитовый оператор И |
| | | Побитовый оператор ИЛИ |
| ^ | Побитовый исключающий оператор ИЛИ |
| ~ | Дополнение двоичной единицы Operator — унарный оператор |
| << | Оператор сдвига влево |
| >> | Оператор сдвига вправо |
Побитовые операторы нельзя напрямую применять к примитивным типам данных, таким как float, double и т. д. Всегда помните, что побитовые операторы в основном используются с целочисленный тип данных благодаря своей совместимости.
Побитовые логические операторы обрабатывают данные побитно, начиная с младшего бита, т. е. младшего бита, который является самым правым битом, и заканчивая старшим битом (самым значащим битом), который является самым левым битом.
Результат вычисления поразрядных логических операторов показан в таблице, приведенной ниже.
| x | y | х&у | х | у | х ^ у |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 |
Побитовое И
Это один из наиболее часто используемых логических поразрядных операторов. Он представлен одним знаком амперсанда (&). С каждой стороны оператора (&) пишутся два целочисленных выражения.
Результат побитовой операции И равен 1, если оба бита имеют значение 1; в противном случае результат всегда равен 0.
Предположим, что у нас есть две переменные op2 и op1 со следующими значениями:
Op1 = 0000 1101 Op2 = 0001 1001
Результатом операции И над переменными op1 и op2 будет
Result = 0000 1001
Как мы видим, две переменные сравниваются побитно. Всякий раз, когда значение бита в обеих переменных равно 1, результат будет 1 или 0.
Побитовое ИЛИ
Он представлен одной вертикальной чертой (|). С каждой стороны оператора (|) пишутся два целочисленных выражения.
Результатом побитовой операции ИЛИ является 1, если хотя бы одно из выражений имеет значение 1; в противном случае результат всегда равен 0.
Предположим, что у нас есть две переменные op2 и op1 со следующими значениями:
Op1 = 0000 1101 Op2 = 0001 1001
Результатом операции ИЛИ над переменными op1 и op2 будет
Result = 0001 1101
Как мы видим, две переменные сравниваются побитно. Всякий раз, когда значение бита в одной из переменных равно 1, результат будет 1 или 0.
Побитовое исключающее ИЛИ
Он обозначается символом (^). С каждой стороны оператора (^) записаны два целочисленных выражения.
Результатом побитовой операции исключающее ИЛИ является 1, если только одно из выражений имеет значение 1; в противном случае результат всегда равен 0.
Предположим, что у нас есть две переменные op2 и op1 со следующими значениями:
Op1 = 0000 1101 Op2 = 0001 1001
Результатом операции XOR над переменными op1 и op2 будет
Result = 0001 0100
Как мы видим, две переменные сравниваются побитно. Всякий раз, когда только одна переменная содержит значение 1, результат равен 0, иначе результатом будет 0.
Давайте напишем простую программу, демонстрирующую побитовые логические операторы.
#include <stdio.h> int main() { int a = 20; /* 20 = 010100 */ int b = 21; /* 21 = 010101 */ int c = 0; c = a & b; /* 20 = 010100 */ printf("AND - Value of c is %d\n", c ); c = a | b; /* 21 = 010101 */ printf("OR - Value of c is %d\n", c ); c = a ^ b; /* 1 = 0001 */ printf("Exclusive-OR - Value of c is %d\n", c ); getch(); }
Выход:
AND - Value of c is 20 OR - Value of c is 21 Exclusive-OR - Value of c is 1
Операторы побитового сдвига
Побитовые операторы сдвига используются для перемещения/сдвига битовых последовательностей влево или вправо. Операторы сдвига влево и вправо, предоставляемые языком программирования C, представляются следующим образом:
Operand << n (Left Shift) Operand >> n (Right Shift)
Здесь,
- операнд — это целочисленное выражение, над которым нам нужно выполнить операцию сдвига.
- 'n' — общее количество битовых позиций, на которые нам нужно сдвинуться в целочисленном выражении.
Операция сдвига влево сместит число n бит в левую сторону. Крайние левые биты выражения будут выдвинуты наружу, а справа будут заполнены n бит со значением 0.
Операция сдвига вправо сместит число «n» битов в правую сторону. Крайние правые 'n' биты в выражении будут выдвинуты, а значение 0 будет заполнено слева.
Пример: x — целочисленное выражение с данными 1111. После выполнения операции сдвига результат будет:
x << 2 (left shift) = 1111<<2 = 1100 x>>2 (right shift) = 1111>>2 = 0011
ShiftОператоры можно комбинировать, а затем использовать для выполнения следующих действий:tracВозьмём данные из целочисленного выражения. Давайте напишем программу, демонстрирующую использование операторов побитового сдвига.
#include <stdio.h> int main() { int a = 20; /* 20 = 010100 */ int c = 0; c = a << 2; /* 80 = 101000 */ printf("Left shift - Value of c is %d\n", c ); c = a >> 2; /*05 = 000101 */ printf("Right shift - Value of c is %d\n", c ); return 0; }
Выход:
Left shift - Value of c is 80 Right shift - Value of c is 5
После выполнения операции сдвига влево значение станет 80, двоичный эквивалент которого равен 101000.
После выполнения операции сдвига вправо значение станет 5, двоичный эквивалент которого равен 000101.
Оператор побитового дополнения
Побитовое дополнение также называется оператором дополнения, поскольку оно всегда принимает только одно значение или операнд. Это унарный оператор.
Когда мы выполняем дополнение любых битов, все 1 становятся 0 и наоборот.
Если у нас есть целочисленное выражение, содержащее 0000 1111, то после выполнения операции побитового дополнения значение станет 1111 0000.
Оператор побитового дополнения обозначается символом тильдой (~).
Давайте напишем программу, демонстрирующую реализацию оператора побитового дополнения.
#include <stdio.h> int main() { int a = 10; /* 10 = 1010 */ int c = 0; c = ~(a); printf("Complement - Value of c is %d\n", c ); return 0; }
Выход:
Complement - Value of c is -11
Вот ещё одна программа с примером использования всех рассмотренных до сих пор операторов:
#include <stdio.h> main() { unsigned int x = 48; /* 48 = 0011 0000 */ unsigned int y = 13; /* 13 = 0000 1101 */ int z = 0; z =x & y; /* 0 = 0000 0000 */ printf("Bitwise AND Operator - x & y = %d\n", z ); z = x | y; /* 61 = 0011 1101 */ printf("Bitwise OR Operator - x | y = %d\n", z ); z= x^y; /* 61 = 0011 1101 */ printf("Bitwise XOR Operator- x^y= %d\n", z); z = ~x; /*-49 = 11001111 */ printf("Bitwise One's Complement Operator - ~x = %d\n", z); z = x << 2; /* 192 = 1100 0000 */ printf("Bitwise Left Shift Operator x << 2= %d\n", z ); z= x >> 2; /* 12 = 0000 1100 */ printf ("Bitwise Right Shift Operator x >> 2= %d\n", z );}
После компиляции и запуска программы она выдает следующий результат:
Bitwise AND Operator - x & y = 0 Bitwise OR Operator - x | y = 61 Bitwise XOR Operator- x^y= 61 Bitwise One's Complement Operator - ~x = -49 Bitwise Left Shift Operator x << 2= 192 Bitwise Right Shift Operator x >> 2= 12
