Перейти к основному содержимому

Битовые операции

Число можно рассматривать как набор битов

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

Коротко

Бит — это 0 или 1. Битовые операции работают не со всем числом как с величиной, а с отдельными двоичными разрядами числа.

Зачем это нужно

В робототехнике битовые операции встречаются, когда нужно:

  • хранить несколько флагов в одном числе;
  • включать или выключать отдельный бит;
  • проверять состояние регистра;
  • читать документацию микроконтроллера;
  • передавать компактные команды.

Для первых программ с переменными, условиями и циклами битовые операции не нужны.

Биты числа

Число 5 в двоичном виде можно представить так:

5 = 00000101

Единицы стоят в разрядах 0 и 2.

AND

Операция & оставляет единицу только там, где единицы есть с двух сторон.

0101
0011
----
0001

Пример:

#include <iostream>
using namespace std;

int main() {
int a = 5;
int b = 3;

cout << (a & b) << endl;
return 0;
}

Вывод:

1

OR

Операция | ставит единицу, если единица есть хотя бы с одной стороны.

0101
0011
----
0111
#include <iostream>
using namespace std;

int main() {
int a = 5;
int b = 3;

cout << (a | b) << endl;
return 0;
}

Вывод:

7

XOR

Операция ^ ставит единицу, если биты различаются.

0101
0011
----
0110
#include <iostream>
using namespace std;

int main() {
int a = 5;
int b = 3;

cout << (a ^ b) << endl;
return 0;
}

Вывод:

6

Маска

Маска — число, в котором важные биты отмечены единицами.

Маска выбирает один бит из числа

#include <iostream>
using namespace std;

int main() {
int state = 5;
int mask = 1;

if ((state & mask) != 0) {
cout << "on" << endl;
} else {
cout << "off" << endl;
}

return 0;
}

Здесь проверяется самый младший бит.

Сдвиги

<< и >> сдвигают биты числа.

#include <iostream>
using namespace std;

int main() {
int a = 1;

cout << (a << 1) << endl;
cout << (a << 2) << endl;
return 0;
}

Вывод:

2
4

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

Практика

  1. Посчитайте результат 6 & 3 вручную в двоичном виде.
  2. Проверьте в программе 6 | 3.
  3. Проверьте младший бит числа 8 через маску 1.
  4. Создайте маску 4 и проверьте третий бит числа 5.
  5. Объясните, почему этот урок отмечен как продвинутый.

Проверьте себя

  1. Что такое бит?
  2. Что делает &?
  3. Что делает |?
  4. Что делает ^?
  5. Зачем нужна маска?
  6. Где битовые операции встречаются в робототехнике?
Ориентиры для самопроверки

Сначала ответьте без подсказки. Ответ можно считать полным, если вы:

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

Если один из пунктов объяснить не получается, найдите соответствующую главу статьи, перечитайте её и повторите ответ.

Словарь статьи

ТерминЗначение
битдвоичный разряд 0 или 1
маскачисло для выбора нужных битов
ANDбитовое «и»
ORбитовое «или»
XORбитовое исключающее «или»
сдвигперемещение битов влево или вправо

Связанные темы

Источники