Можно ли выполнять побитовые операции (AND, OR, XOR) для больших чисел, представленных символьными массивами?
Я понимаю, что побитовые операции над числами, представленными нативными типами данных в C, - это просто.
Однако есть ли способ сделать то же самое для больших чисел, представленных массивами символов?
Я попробовал поискать в Google, но на удивление не смог найти ответ. Итак, буду сердечно благодарен за любые указатели.
Спасибо и привет, Аджай
1 ответ
Нет, это невозможно.
Чтобы вычислить булеву операцию для такого вектора, необходимо разбить его на куски целого числа битов.
Например, если у вас есть цифра 378, каждая цифра представляет лог2(8) = 3 бита.
Вы можете взять каждую цифру, выполнить 3-битную логическую операцию и вычислить окончательный результат, сдвинув результат каждой цифры:
378 И 168 = (3 И 1) · 23 + (7 И 6) = 1 · 23 + 6 = 168 = 1410.
Где жирным шрифтом 3 является количество битов каждой цифры, как указано выше.
Если вы примените те же рассуждения с базовой цифрой десять, как 3710, вы увидите, что каждая цифра представляет
log2(10) ≈ 3.32192...
Поскольку это не целое число, вы не можете выполнить сдвиг на 23.32192..., однако проблема не в том, что log2(10) не является целым числом;
Если бы вы имели, чтобы каждая цифра представляла 1,5 бита, вы могли бы взять 2 цифры за раз, чтобы сформировать 3-битную группу. По сути, вы бы работали, разбивая вектор на каждые два символа, преобразовывая их в двоичные, выполняя булеву операцию и возвращая частичные результаты в конечный.
Именно так работает base64, требующий четыре 6-битных цифры для создания трех 8-битных цифр.
Проблема с log2(10) состоит в том, что он иррациональный, поэтому вы никогда не сможете найти два целых числа n и k, которые бы
log2(10) · n = k
потому что уравнение эквивалентно k / n = log2(10) и левая часть рациональна, а правая - нет.
Таким образом, вы не можете разбить массив на цифры (или группы цифр), вычислить частичные результаты и объединить результаты обратно со сдвигами.