Можно ли выполнять побитовые операции (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) и левая часть рациональна, а правая - нет.

Таким образом, вы не можете разбить массив на цифры (или группы цифр), вычислить частичные результаты и объединить результаты обратно со сдвигами.

Другие вопросы по тегам