Начнём с честного вопроса: мы только что научились укладывать числа в биты – зачем теперь эти биты трогать по отдельности? Разве недостаточно обычной арифметики?
Разберём задачу, где обычной арифметики действительно не хватает.
Представьте настройки в приложении: восемь переключателей – уведомления, тёмная тема, автосохранение, звук и так далее. Каждый – «включено / выключено», то есть ровно один бит информации. Можно завести восемь отдельных переменных. Но в уроке 5.1 мы выяснили: даже одно значение «да/нет» занимает в памяти целый байт, потому что байт – минимальная адресуемая порция. Восемь переключателей – восемь байтов, из которых по делу используется восемь битов, а 56 пропадают впустую.
А можно сложить все восемь переключателей в одно число: бит 0 – уведомления, бит 1 – тёмная тема, бит 2 – автосохранение… Тогда все настройки – это один байт, который целиком помещается в одну переменную, одним числом сохраняется в файл и одним числом передаётся по сети. Такое число называют набором флагов, и встречается оно всюду.
Но чтобы с ним работать, нужны инструменты: как узнать, включён ли конкретный переключатель, не трогая остальные? Как включить один, оставив прочие как были? Обычные +, −, * тут не годятся – они смешивают разряды между собой (при сложении бывает перенос). Нужны операции, которые работают с каждым битом независимо от соседей. Это и есть побитовые операции.