побитовое OperaТоры в C: AND, OR, XOR, Shift & Дополнить

⚡ Умное резюме

В языке C побитовые операторы манипулируют данными на уровне отдельных битов, используя операции И, ИЛИ, Исключающее ИЛИ, дополнение и сдвиг над целочисленными операндами для выполнения более быстрых вычислений, упаковки флагов и управления оборудованием в низкоуровневом и встроенном программировании.

  • 🧮 OperaТорс: Шесть операторов — И (&), ИЛИ (|), Исключающее ИЛИ (^), Дополнение (~), Левый сдвиг (<<), Правый сдвиг (>>) — действуют побитово.
  • 🔗 И И ИЛИ: Результат операции & равен 1 только тогда, когда оба бита равны 1; результат операции | равен 1, когда хотя бы один из битов равен 1.
  • 🔀 Исключающее ИЛИ: Результат операции ^ равен 1, когда ровно один бит равен 1, что удобно для переключения битов и обмена местами.ping значения.
  • ↔️ Shifts: Операторы << и >> перемещают биты влево или вправо, умножая или деля на степени двойки.
  • 🔁 Дополнение: Оператор ~ инвертирует каждый бит, поэтому 0000 1111 становится 1111 0000.
  • 🤖 Помощь ИИ: Искусственный интеллект и GitHub Copilot быстро генерируют и объясняют логику битовых масок и сдвигов.

побитовое Operaторс в С

Что такое побитовые 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

Часто задаваемые вопросы (FAQ)

Побитовое И (&) работает с отдельными битами и возвращает целое число, в то время как логическое И (&&) проверяет целые выражения и возвращает одно логическое значение true или false.

Shift 1. Чтобы создать маску: установить значение | (1 << n), очистить значением & ~(1 << n) и переключить значением ^ (1 << n).

Сдвиг влево на n умножает беззнаковое значение на 2, возведенное в степень n; сдвиг вправо делит на него, поэтому компиляторы используют сдвиги для повышения скорости.

Проверка числа и 1. Младший бит возвращает 1 для нечетных значений и 0 для четных, что быстрее, чем оператор взятия остатка от деления.

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

Shift Операторы связывания более строгие, чем операторы сравнения, в то время как &, ^ и | находятся ниже равенства, но выше логических && и ||, поэтому для безопасности их следует заключать в скобки.

Да. Искусственный интеллект-помощник в программировании пишет маски и сдвиги на основе подсказки, объясняет отрицательные дополнения и преобразует бинарные примеры в работающий код на языке C. Всегда проверяйте результат.

Второй пилот GitHub Предлагает макросы для битовых масок, вспомогательные функции для установки и сброса битов, а также математические операции сдвига из комментария; проверьте варианты автодополнения, сопоставив их с вашей битовой схемой.

Подведем итог этой публикации следующим образом: