Тому що вони фундаментальні операції.
З тієї ж думки ви можете стверджувати, що додавання має мало використання в реальному світі, оскільки його можна повністю замінити відніманням (і запереченням) та множенням. Але ми продовжуємо додавати, оскільки це фундаментальна операція.
І ні на хвилину не думайте, що те, що ви не бачили великої потреби в бітових операціях, не означає, що вони використовуються не дуже часто. Дійсно, я використовував побітну функцію майже на будь-якій мові, яку використовував для таких речей, як бітове маскування.
У верхній частині голови я використовував побітові операційні можливості для обробки зображень, бітових полів та прапорів, обробки тексту (наприклад, всі символи певного класу часто мають загальний бітовий зразок), кодування та декодування серіалізованих даних, декодування VM чи процесора опкоди тощо. Без бітових операцій, більшість із цих завдань потребують у багато разів складніших операцій, щоб виконати завдання менш надійно або з поганою читабельністю.
Наприклад:
// Given a 30-bit RGB color value as a 32-bit int
// A lot of image sensors spit out 10- or 12-bit data
// and some LVDS panels have a 10- or 12-bit format
b = (color & 0x000003ff);
g = (color & 0x000ffc00) >> 10;
r = (color & 0x3ff00000) >> 20;
// Going the other way:
color = ((r << 20) & 0x3ff00000) | ((g << 10) & 0x000ffc00) | (b & 0x000003ff);
Розшифровка інструкцій процесора для процесорів типу RISC (наприклад, при емуляції іншої платформи) вимагає витягування частин великого значення, як зазначено вище. Іноді виконання цих операцій з множенням та діленням та модулем тощо може бути вдесятеро повільніше, ніж еквівалентний бітовий оп.