Рассмотрим выполнение логических операций И, ИЛИ, Исключающее ИЛИ и НЕ над многоразрядными числами.
Основная особенность выполнения побитовых логических операций над такими числами состоит в том, что каждое из них предварительно необходимо перевести в систему счисления с основанием, кратным 2, и только после этого выполнять логические операции. При необходимости результат можно снова перевести в десятичную систему счисления.
О переводе многоразрядных чисел в различные системы счисления подробно описано в этой статье.
Выполнение бинарной логической операции (то есть операции над двумя числами) осуществляется в следующем порядке:
- Представить каждое число в 16-ричной системе счисления
- Выровнять два числа по правому краю, поскольку побитовая операция будет осуществляться начиная с младшей 16-ричной цифры
- Выполнить поразрядную логическую операцию над цифрами двух чисел
- Сохранить цифру результата
- Перейти к следующей цифре, двигаясь к началу пока не будут обработаны все цифры наиболее длинного числа
- При необходимости перевести результат в десятичную систему счисления
Для выполнения унарной логической операции (в частности, логическое отрицание — НЕ) мы представляем обрабатываемое число в 16-ричной системе счисления и инвертируем каждую цифру числа. При необходимости переводим результат в десятичную систему счисления.
Реализация на C++
#include
using namespace std; // Перевод цифры в символ
// Перевод цифры от 0 до F в символьное представление
char digittochar( int num)
<
switch (num)
<
case 0: return ‘0’ ;
case 1: return ‘1’ ;
case 2: return ‘2’ ;
case 3: return ‘3’ ;
case 4: return ‘4’ ;
case 5: return ‘5’ ;
case 6: return ‘6’ ;
case 7: return ‘7’ ;
case 8: return ‘8’ ;
case 9: return ‘9’ ;
case 10: return ‘A’ ;
case 11: return ‘B’ ;
case 12: return ‘C’ ;
case 13: return ‘D’ ;
case 14: return ‘E’ ;
case 15: return ‘F’ ;
>
>
// Перевод символа от ‘0’ до ‘F’ в цифру
int digittoint( char num)
<
switch (num)
<
case ‘0’ : return 0;
case ‘1’ : return 1;
case ‘2’ : return 2;
case ‘3’ : return 3;
case ‘4’ : return 4;
case ‘5’ : return 5;
case ‘6’ : return 6;
case ‘7’ : return 7;
case ‘8’ : return 8;
case ‘9’ : return 9;
case ‘A’ : return 10;
case ‘B’ : return 11;
case ‘C’ : return 12;
case ‘D’ : return 13;
case ‘E’ : return 14;
case ‘F’ : return 15;
>
>
int dectox( char *a, int q, int p, char *c)
<
int rest = 0; // остаток от деления
char *s; // символьное десятичное представление частного a/p
int lena = strlen(a);
s = new char [lena];
int flag = 0; // проверка на нулевой результат в частном
for ( int i = 0; i int dig = a[i] > 0 ? digittoint(a[i]) : 0;
int num = rest*q + dig; // делимое на текущем шаге
s[i] = digittochar(num / p); // следующий разряд частного
rest = num % p; // остаток от деления
if (s[i] != ‘0’ ) flag = 1; // в случае ненулевого результата установить флаг
>
if (flag == 0) // частное равно 0, базовый случай рекурсии
<
c[0] = digittochar(rest); return 1; // запись старшего разряда результата
>
s[lena] = ‘