Думаю, что вторая часть вопроса:
Кроме того, для чего на самом деле используются побитовые операторы? Буду признателен за несколько примеров.
Решено лишь частично. Это мои два цента по этому поводу.
Побитовые операции в языках программирования играют фундаментальную роль при работе с большим количеством приложений. Почти все низкоуровневые вычисления должны выполняться с использованием такого рода операций.
Во всех приложениях, которым необходимо отправлять данные между двумя узлами, например:
На более низком уровне связи данные обычно отправляются так называемыми кадрами . Фреймы - это просто строки байтов, которые отправляются по физическому каналу. Эти кадры обычно содержат фактические данные плюс некоторые другие поля (закодированные в байтах), которые являются частью того, что называется заголовком . Заголовок обычно содержит байты, которые кодируют некоторую информацию, относящуюся к состоянию связи (например, с флагами (битами)), счетчиками кадров, кодами исправления и обнаружения ошибок и т. Д. Для получения переданных данных в кадре и для построения кадры для отправки данных, которые вам понадобятся для выполнения побитовых операций.
В общем, при работе с такими приложениями доступен API, поэтому вам не нужно разбираться со всеми этими деталями. Например, все современные языки программирования предоставляют библиотеки для подключений к сокетам, поэтому вам на самом деле не нужно создавать фреймы связи TCP / IP. Но подумайте о хороших людях, которые запрограммировали эти API для вас, им наверняка приходилось иметь дело с конструкцией фреймов; использование всевозможных поразрядных операций для перехода от низкоуровневой связи к высокоуровневой.
В качестве конкретного примера представьте, что кто-то дает вам файл, содержащий необработанные данные, которые были захвачены непосредственно телекоммуникационным оборудованием. В этом случае, чтобы найти фреймы, вам нужно будет прочитать необработанные байты в файле и попытаться найти какие-то слова синхронизации, побитно просканировав данные. После определения слов синхронизации вам нужно будет получить фактические кадры и при необходимости ПЕРЕМЕСТИТЬ их (и это только начало истории), чтобы получить фактические данные, которые передаются.
Еще одно совершенно другое семейство приложений низкого уровня - это когда вам нужно управлять оборудованием с помощью некоторых (древних) портов, таких как параллельные и последовательные порты. Эти порты управляются установкой нескольких байтов, и каждый бит этих байтов имеет определенное значение с точки зрения инструкций для этого порта (см., Например, http://en.wikipedia.org/wiki/Parallel_port ). Если вы хотите создать программное обеспечение, которое что-то делает с этим оборудованием, вам потребуются побитовые операции для преобразования инструкций, которые вы хотите выполнить, в байты, которые понимает порт.
Например, если у вас есть какие-то физические кнопки, подключенные к параллельному порту для управления другим устройством, это строка кода, которую вы можете найти в программном приложении:
read = ((read ^ 0x80) >> 4) & 0x0f;
Надеюсь, это поможет.