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