Побитовые операторы в C: И, ИЛИ, XOR, сдвиги и дополнение — подробно
Что такое побитовые операторы?
Побитовые операторы манипулируют отдельными битами целочисленных значений. В отличие от арифметических операторов, работающих с целыми числами, побитовые операторы действуют на двоичном представлении, делая их идеальными для производительно-критических задач: флаги, битовые маски, низкоуправление устройствами.
В C доступны следующие побитовые операторы:
| Оператор | Значение |
|---|---|
| & | Побитовое И (AND) |
| | | Побитовое ИЛИ (OR) |
| ^ | Побитовое XOR (исключающее ИЛИ) |
| ~ | Побитовое НЕ (одноразрядное дополнение) |
| << | Левый сдвиг |
| >> | Правый сдвиг |
Побитовые операторы определены только для целочисленных типов; они неприменимы к типам с плавающей точкой как float или double.
Операции начинаются с наименее значащего бита (LSB) и идут к наиболее значащему (MSB). Следующая таблица истинности суммирует бинарные результаты:
Операнд x | Операнд y | x & y | x | y | 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. Часто используется для маскирования ненужных битов.
Op1 = 0000 1101 Op2 = 0001 1001 Result = 0000 1001
Побитовое ИЛИ (|)
Оператор ИЛИ возвращает 1, если хотя бы один из бит — 1. Полезен для установки конкретных бит.
Op1 = 0000 1101 Op2 = 0001 1001 Result = 0001 1101
Побитовое XOR (^)
Оператор XOR возвращает 1 только когда биты различаются. Удобен для переключения бит.
Op1 = 0000 1101 Op2 = 0001 1001 Result = 0001 0100
Пример программы:
#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 - c = %d\n", c); c = a | b; /* 21 = 010101 */ printf("OR - c = %d\n", c); c = a ^ b; /* 1 = 000001 */ printf("XOR - c = %d\n", c); return 0; }
Вывод:
AND - c = 20 OR - c = 21 XOR - c = 1
Операторы сдвига (<< и >>)
Операторы сдвига двигают биты влево или вправо на указанное количество.
operand << n— сдвиг влево, вставляя нули справа.operand >> n— сдвиг вправо, вставляя нули слева.
Пример с 4-битным числом 1111:
x << 2 → 1100 x >> 2 → 0011
Программа-иллюстрация:
#include <stdio.h> int main() { int a = 20; /* 20 = 010100 */ int c = 0; c = a << 2; /* 80 = 101000 */ printf("Left shift - c = %d\n", c); c = a >> 2; /* 5 = 000101 */ printf("Right shift - c = %d\n", c); return 0; }
Вывод:
Left shift - c = 80 Right shift - c = 5
Побитовое дополнение (~)
Оператор дополнения инвертирует каждый бит: 1 становится 0 и наоборот. Это унарный оператор, применяемый к одному операнду.
0000 1111 → 1111 0000
Пример программы:
#include <stdio.h> int main() { int a = 10; /* 10 = 001010 */ int c = ~a; /* -11 в дополнительном коде */ printf("Complement - c = %d\n", c); return 0; }
Вывод:
Complement - c = -11
Все операторы вместе
Ниже приведена лаконичная программа, демонстрирующая каждый обсуждаемый побитовый оператор.
#include <stdio.h> int main() { unsigned int x = 48; /* 0011 0000 */ unsigned int y = 13; /* 0000 1101 */ int z = 0; z = x & y; /* 0 = 0000 0000 */ printf("AND - x & y = %d\n", z); z = x | y; /* 61 = 0011 1101 */ printf("OR - x | y = %d\n", z); z = x ^ y; /* 61 = 0011 1101 */ printf("XOR - x ^ y = %d\n", z); z = ~x; /* -49 = 1111 0100 (дополнительный код) */ printf("NOT - ~x = %d\n", z); z = x << 2; /* 192 = 1100 0000 */ printf("Left shift - x << 2 = %d\n", z); z = x >> 2; /* 12 = 0000 1100 */ printf("Right shift - x >> 2 = %d\n", z); return 0; }
Результат:
AND - x & y = 0 OR - x | y = 61 XOR - x ^ y = 61 NOT - ~x = -49 Left shift - x << 2 = 192 Right shift - x >> 2 = 12
Ключевые выводы
- Побитовые операторы эксклюзивны для целочисленных типов и работают на бинарном уровне.
- Они включают логические (AND, OR, XOR), сдвиговые (left/right) и дополнение (~) операции.
- Эти операторы незаменимы для задач вроде манипуляции флагами, низкоуровневого ввода-вывода и производительно-критического кода.
Язык C
- Классы и объекты в C#: Фундаменты надёжного ООП
- Абстрактные классы и методы в C#: практическое руководство
- Частичные классы и методы в C#: понимание и применение
- Sealed-классы и sealed-методы в C#: когда использовать, примеры и повышение безопасности кода
- Освоение операторов C++: полное руководство с практическими примерами
- Ключевые слова и идентификаторы в C: практическое руководство
- Операторы в C: исчерпывающее руководство
- IoT и блокчейн: смена парадигмы в доверии к данным и эффективности
- Операторы в C++: типы, примеры и практические программы
- Подробное руководство по операторам Python: арифметические, логические, сравнения, присваивания, битовые и прио…