Програмування (мова С) 100 балів
Напишіть програму, яка змінює значення всіх парних бітів (біти нумеруються з правого боку на лівий, починаючи з 1) довільного символу на протилежні (1 на 0, 0 на 1). Програма повинна надавати можливість вводити різні символи та виводити результат як у символьному, так і у двійковому вигляді.
Программирование (язык С) 100 баллов
Напишите приложение, которое изменяет значение всех парных битов (биты нумеруются с правой стороны на левую, начиная с 1) произвольного символа на противоположные (1 на 0, 0 на 1). Программа должна давать возможность вводить разные символы и выводить результат как в символьном, так и в двоичном виде.
Answers & Comments
Ответ:
ниже
Объяснение:
рок №48. Побітові оператори
TelegramFacebookTwitterPinterest
Юрій |
Уроки по С++
| Оновл. 4 Вер 2021 | 1075
Побітові оператори маніпулюють окремими бітами в межах змінної.
Примітка: Для деяких цей матеріал може здатися складним. Якщо ви застрягли або щось не зрозуміло — пропустіть цей урок (і наступний), в майбутньому ви зможете повернутися і розібратися детальніше. Він не настільки важливий для прогресу у вивченні мови C++, як інші уроки, і викладений тут, в більшій мірі, для загального розвитку.
Зміст:
Навіщо потрібні побітові оператори?
Побітовий зсув вліво (<<) і побітовий зсув вправо (>>)
Що!? Невже оператори << і >> використовуються не для вводу та виводу даних?
Побітовий оператор НЕ
Побітові оператори І, АБО та виключне АБО (XOR)
Побітові оператори присвоювання
Висновки
Тест
Відповіді
Навіщо потрібні побітові оператори?
У далекому минулому комп’ютерної пам’яті було дуже мало і нею дуже дорожили. Це було стимулом максимально розумно використовувати кожен доступний біт. Наприклад, в логічному типі даних bool є всього лише два можливих значення (true і false), які можуть бути представлені одним бітом, але по факту займають цілий байт пам’яті! А це, в свою чергу, через те, що змінні використовують унікальні адреси пам’яті, а вони виділяються тільки в байтах. Змінна типу bool займає 1 біт, а інші 7 витрачаються даремно.
Використовуючи побітові оператори, можна створювати функції, які дозволять вмістити 8 значень типу bool в змінній розміром 1 байт, що значно заощадить споживання пам’яті. У минулому такий трюк був дуже популярний. Але сьогодні, принаймні, в прикладному програмуванні, це не так.
Тепер пам’яті значно більше і програмісти побачили, що краще писати код так, щоб було простіше і зрозуміліше його підтримувати, ніж ускладнювати його заради незначної економії пам’яті. Тому попит на використання побітових операторів дещо спав, за винятком випадків, коли необхідна максимальна оптимізація (наприклад, наукові програми, які використовують величезну кількість даних; ігри, де маніпуляції з бітами можуть бути використані для додаткової швидкості тощо).
У мові С++ є 6 побітових операторів:
Оператор Символ Приклад Операція
Побітовий зсув вліво << x << y Всі біти в x зміщуються вліво на y біт
Побітовий зсув вправо >> x >> y Всі біти в x зміщуються вправо на y біт
Побітове НЕ ~ ~x Всі біти в x змінюються на протилежні
Побітове І & x & y Кожен біт в x І кожен біт в y
Побітове АБО | x | y Кожен біт в x АБО кожен біт в y
Побітове виключне АБО (XOR) ^ x ^ y Кожен біт в x XOR кожен біт в y
У побітових операціях слід використовувати тільки цілочисельні типи даних unsigned, так як мова C++ не завжди гарантує коректну роботу побітових операторів з цілочисельними типами signed.
Правило: При роботі з побітовими операторами використовуйте цілочисельні типи даних unsigned.
Побітовий зсув вліво (<<) і побітовий зсув вправо (>>)
У мові C++ кількість використовуваних біт ґрунтується на розмірі типу даних (в 1 байті знаходяться 8 біт). Оператор побітового зсуву вліво (<<) зміщує біти вліво. Лівий операнд є виразом, в якому вони зміщуються, а правий — кількість місць, на які потрібно змістити. Тому в виразі 3 << 1 мається на увазі “змістити біти вліво в літералі 3 на одне місце”.
Примітка: У наступних прикладах ми будемо працювати з 4-бітними двійковими значеннями.
Розглянемо число 3, яке в двійковій системі числення дорівнює 0011:
3 = 0011
3 << 1 = 0110 = 6
3 << 2 = 1100 = 12
3 << 3 = 1000 = 8
В останньому третьому випадку один біт зміщується за межі самого літералу! Біти, зсунуті за межі двійкового числа, губляться назавжди.
Оператор побітового зсуву вправо (>>) зміщує біти вправо, наприклад:
12 = 1100
12 >> 1 = 0110 = 6
12 >> 2 = 0011 = 3
12 >> 3 = 0001 = 1
У третьому випадку ми знову перемістили біт за межі літералу. Він також загубився назавжди.
Хоча у вищенаведених прикладах ми зміщуємо біти в літералах, ми також можемо зміщувати біти і в змінних:
unsigned int x = 4;
x = x << 1; // x повинен бути 8
Слід пам’ятати, що результати операцій з побітовими зсувами в різних компіляторах можуть відрізнятися.
Що!? Невже оператори << і >> використовуються не для вводу та виводу даних?
І для цього також.
Зараз користь від використання побітових операторів не така велика, як це було раніше. Зараз в більшості випадків оператор побітового зсуву вліво використовується для виводу даних. Наприклад, розглянемо наступну програму:
#include <iostream>
int main()
{
unsigned int x = 4;
x = x << 1; // оператор << використовується для побітового зсуву вліво
std::cout << x; // оператор << використовується для виводу даних в консоль
return 0;