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