C Побитовые операторы: AND, OR, XOR, Shift & Дополнение (с примером)

Содержание:

Anonim

Что такое побитовые операторы?

БИТСТРЕННЫЕ ОПЕРАТОРЫ используются для управления данными на битовом уровне, что также называется программированием битового уровня. Побитовое оперирование одним или несколькими битовыми комбинациями или двоичными числами на уровне их отдельных битов. Они используются в численных вычислениях, чтобы ускорить процесс вычислений.

Ниже приведен список побитовых операторов, предоставляемых языком программирования C:

Оператор Смысл
& Побитовый оператор И
| Побитовый оператор ИЛИ
^ Побитовое исключающее ИЛИ
~ Оператор дополнения Binary One - это унарный оператор
<< Оператор сдвига влево
>> Оператор сдвига вправо

Побитовые операторы нельзя напрямую применять к примитивным типам данных, таким как float, double и т. Д. Всегда помните одну вещь, что побитовые операторы в основном используются с целочисленными типами данных из-за их совместимости.

Поразрядные логические операторы работают с данными побитно, начиная с младшего значащего бита, т. Е. Младшего бита, который является крайним правым битом, работая в направлении MSB (наиболее значимый бит), который является крайним левым битом.

Результат вычисления поразрядных логических операторов показан в таблице ниже.

Икс y х и у х | y х у
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0

В этом руководстве вы узнаете:

  • Что такое побитовые операторы?
  • Побитовое И
  • Побитовое ИЛИ
  • Побитовое исключающее ИЛИ
  • Операторы побитового сдвига
  • Оператор побитового дополнения

Побитовое И

Это один из наиболее часто используемых логических побитовых операторов. Он представлен одним знаком амперсанда (&). С каждой стороны от оператора (&) написано два целочисленных выражения.

Результат поразрядной операции И равен 1, если оба бита имеют значение 1; в противном случае результат всегда равен 0.

Предположим, у нас есть 2 переменные op1 и op2 со следующими значениями:

Op1 = 0000 1101Op2 = 0001 1001

Результатом операции И над переменными op1 и op2 будет

Result = 0000 1001

Как видим, две переменные сравниваются по крупицам. Когда значение бита в обеих переменных равно 1, результатом будет 1 или 0.

Побитовое ИЛИ

Он представлен одной вертикальной чертой (|). С каждой стороны от оператора (|) написано два целочисленных выражения.

Результатом побитовой операции ИЛИ будет 1, если хотя бы одно из выражений имеет значение 1; в противном случае результат всегда равен 0.

Предположим, у нас есть 2 переменные op1 и op2 со следующими значениями:

Op1 = 0000 1101Op2 = 0001 1001

Результатом операции ИЛИ над переменными op1 и op2 будет

Result = 0001 1101

Как видим, две переменные сравниваются по крупицам. Когда значение бита в одной из переменных равно 1, результатом будет 1 или 0.

Побитовое исключающее ИЛИ

Обозначается символом (^). С каждой стороны от оператора (^) написано два целочисленных выражения.

Результатом побитовой операции исключающего ИЛИ будет 1, если только одно из выражений имеет значение 1; в противном случае результат всегда равен 0.

Предположим, у нас есть 2 переменные op1 и op2 со следующими значениями:

Op1 = 0000 1101Op2 = 0001 1001

Результатом операции ИЛИ над переменными op1 и op2 будет

Result = 0001 0100

Как видим, две переменные сравниваются по крупицам. Если только одна переменная содержит значение 1, результатом будет 0, иначе результатом будет 0.

Напишем простую программу, демонстрирующую поразрядные логические операторы.

#include 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 20OR - Value of c is 21Exclusive-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 = 1100x>>2 (right shift) = 1111>>2 = 0011

Операторы сдвига можно комбинировать, а затем использовать для извлечения данных из целочисленного выражения. Напишем программу, демонстрирующую использование операторов побитового сдвига.

#include 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 80Right shift - Value of c is 5

После выполнения операции сдвига влево значение станет 80, двоичный эквивалент которого равен 101000.

После выполнения операции сдвига вправо значение станет равным 5, двоичный эквивалент которого равен 000101.

Оператор побитового дополнения

Побитовое дополнение также называется оператором дополнения, поскольку оно всегда принимает только одно значение или операнд. Это унарный оператор.

Когда мы выполняем дополнение к любым битам, все единицы становятся нулями и наоборот.

Если у нас есть целочисленное выражение, содержащее 0000 1111, то после выполнения операции побитового дополнения значение станет 1111 0000.

Оператор побитового дополнения обозначается символом тильда (~).

Напишем программу, демонстрирующую реализацию оператора поразрядного дополнения.

#include 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 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; /*-61 = 1100 0011 */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 = 0Bitwise OR Operator - x | y = 61Bitwise XOR Operator- x^y= 61Bitwise One's Complement Operator - ~x = -49Bitwise Left Shift Operator x << 2= 192Bitwise Right Shift Operator x >> 2= 12

Резюме

  • Побитовые операторы - это специальный набор операторов, предоставляемый буквой C.
  • Они используются в программировании на битовом уровне.
  • Эти операторы используются для управления битами целочисленного выражения.
  • Логические, сдвиг и дополнение - это три типа побитовых операторов.
  • Оператор побитового дополнения используется для изменения битов выражения.