← Назад ко всем вопросам

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

1️⃣ Как кратко ответить

Битовые операции в C++ — это операции, которые выполняются на уровне отдельных битов данных. Они включают в себя побитовые И (AND), ИЛИ (OR), исключающее ИЛИ (XOR), сдвиги влево и вправо, а также побитовое НЕ (NOT). Эти операции используются для манипуляции данными на низком уровне, оптимизации производительности и работы с флагами.

2️⃣ Подробное объяснение темы

Битовые операции позволяют работать с данными на уровне отдельных битов, что может быть полезно для оптимизации производительности и управления состоянием. В C++ битовые операции выполняются над целочисленными типами данных, такими как int, unsigned int, long, и т.д.

Основные битовые операции

  1. Побитовое И (AND) &:

    • Операция сравнивает соответствующие биты двух операндов и возвращает 1, если оба бита равны 1, иначе возвращает 0.
    • Пример: 5 & 3 (в двоичном виде 0101 & 0011) даст 0001, что равно 1.
  2. Побитовое ИЛИ (OR) |:

    • Операция сравнивает соответствующие биты двух операндов и возвращает 1, если хотя бы один из битов равен 1.
    • Пример: 5 | 3 (в двоичном виде 0101 | 0011) даст 0111, что равно 7.
  3. Побитовое исключающее ИЛИ (XOR) ^:

    • Операция сравнивает соответствующие биты двух операндов и возвращает 1, если биты различны, иначе возвращает 0.
    • Пример: 5 ^ 3 (в двоичном виде 0101 ^ 0011) даст 0110, что равно 6.
  4. Побитовое НЕ (NOT) ~:

    • Операция инвертирует все биты операнда.
    • Пример: ~5 (в двоичном виде 0101) даст 1010, что в 32-битной системе будет равно -6 из-за представления чисел в дополнительном коде.
  5. Сдвиг влево <<:

    • Операция сдвигает биты влево на указанное количество позиций, заполняя освободившиеся места нулями.
    • Пример: 5 << 1 (в двоичном виде 0101 << 1) даст 1010, что равно 10.
  6. Сдвиг вправо >>:

    • Операция сдвигает биты вправо на указанное количество позиций. Для знаковых чисел может использоваться арифметический сдвиг, который сохраняет знак числа.
    • Пример: 5 >> 1 (в двоичном виде 0101 >> 1) даст 0010, что равно 2.

Применение битовых операций

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

Пример кода

#include <iostream>
​
int main() {
    unsigned int a = 5; // 0101 в двоичном виде
    unsigned int b = 3; // 0011 в двоичном виде
​
    // Побитовое И
    unsigned int andResult = a & b; // 0001 в двоичном виде, что равно 1
    std::cout << "a & b = " << andResult << std::endl;
​
    // Побитовое ИЛИ
    unsigned int orResult = a | b; // 0111 в двоичном виде, что равно 7
    std::cout << "a | b = " << orResult << std::endl;
​
    // Побитовое исключающее ИЛИ
    unsigned int xorResult = a ^ b; // 0110 в двоичном виде, что равно 6
    std::cout << "a ^ b = " << xorResult << std::endl;
​
    // Побитовое НЕ
    unsigned int notResult = ~a; // 11111111111111111111111111111010 в 32-битной системе, что равно -6
    std::cout << "~a = " << notResult << std::endl;
​
    // Сдвиг влево
    unsigned int leftShiftResult = a << 1; // 1010 в двоичном виде, что равно 10
    std::cout << "a << 1 = " << leftShiftResult << std::endl;
​
    // Сдвиг вправо
    unsigned int rightShiftResult = a >> 1; // 0010 в двоичном виде, что равно 2
    std::cout << "a >> 1 = " << rightShiftResult << std::endl;
​
    return 0;
}
  • unsigned int a = 5; и unsigned int b = 3; инициализируют переменные a и b значениями 5 и 3 соответственно.
  • unsigned int andResult = a & b; выполняет побитовое И над a и b, результат сохраняется в andResult.
  • unsigned int orResult = a | b; выполняет побитовое ИЛИ над a и b, результат сохраняется в orResult.
  • unsigned int xorResult = a ^ b; выполняет побитовое исключающее ИЛИ над a и b, результат сохраняется в xorResult.
  • unsigned int notResult = ~a; выполняет побитовое НЕ над a, результат сохраняется в notResult.
  • unsigned int leftShiftResult = a << 1; сдвигает биты a влево на одну позицию, результат сохраняется в leftShiftResult.
  • unsigned int rightShiftResult = a >> 1; сдвигает биты a вправо на одну позицию, результат сохраняется в rightShiftResult.
  • std::cout выводит результаты каждой операции на экран.

Тема: C++ Язык (квалификаторы, cast, категории значений)
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки