/* Вариант 7 Мельник Виктор Викторович ИСПР Ускор Лабораторная работа № 1 */ #include "stdafx.h" #include #include #include using namespace std; const int CAPACITY = 32; // разрядность // Получить бит по номеру позиции bool getBit(int value, int position) { return (value >> position) & 1; } // Установить значение бита по номеру позиции int setBit(int value, int position, bool bit) { int mask = 1 << position; if(bit) return value | mask; // ставим 1 return value & ~mask; // ставим 0 } // Сложение чисел побитово int addNumbers(int num1, int num2, int position) { if(position > CAPACITY) return num1; // Получаем биты bool bit1 = getBit(num1, position); bool bit2 = getBit(num2, position); if(bit1 && bit2) { // Если 1 и 1, то заполняем нулями, пока есть единицы int pos = position; do { num1 = setBit(num1, pos++, 0); } while (getBit(num1, pos)); num1 = setBit(num1, pos, 1); return addNumbers(num1, num2, position+1); } else { num1 = setBit(num1, position, bit1 | bit2); return addNumbers(num1, num2, position+1); } } void decode(int a) { for (int i = CAPACITY-1; i >= 0; i-=2) { bool firstBite = getBit(a, i); bool secondBite = getBit(a, i-1); if (firstBite) { if (secondBite) cout << "&"; else cout << "$"; } else { if (secondBite) cout << "@"; else cout << "#"; } } cout << endl; } // Вывод двоичного числа void printBinary(int value) { for (int i = CAPACITY-1; i >= 0; i--) { cout << getBit(value, i); } cout << "\t" << value << endl; } int main() { setlocale(LC_CTYPE, ""); int a; cout << "Введите a: "; cin >> a; int sum = addNumbers(a << 3, a << 1, 0); cout << "Побитово: " << sum << endl; sum = a * 10; cout << "Оригинал: " << sum << endl; printBinary(a); cout << "Декодировано: "; decode(a); cin.get(); cin.get(); return 0; }