Как объединить два двоичных числа в троичное число - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть два двоичных числа, x0 и x1, которые являются 8 битами (поэтому они охватывают от 0 до 255). Это утверждение всегда верно в отношении этих чисел: x0 & x1 == 0. Вот пример:

bx0 = 100 # represented as 01100100 in binary
bx1 = 129 # represented as 10000001 in binary

Так что мне нужно сделать следующую операцию с этими номерами. Сначала интерпретируйте эти двоичные представления как троичные (base-3) числа следующим образом:

tx0 = ternary(bx0) # becomes  981 represented as 01100100 in ternary
tx1 = ternary(bx1) # becomes 2188 represented as 10000001 in ternary

Затем поменяйте местами все 1 в троичном представлении от tx1 до 2:

tx1_swap = swap(tx1) # becomes 4376, represented as 20000002 in ternary

Затем используйте троичную версию OR, чтобы получить окончательное объединенное число:

result = ternary_or(tx0, tx1_swap) # becomes 5357, represented as 21100102 in ternary

Мне не нужно сохранять троичное представление, сохраненное в любой точке, мне нужен только результат, например, result=5357. Конечно, я мог бы закодировать это путем преобразования чисел в двоичные, преобразования в троичные и т. Д., Но мне нужно, чтобы эта операция была быстрой, потому что я делаю это много раз в своем коде. Что бы быстрый способ реализовать это в Python?

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Повторное объяснение для чайников вроде меня:

Простой способ «кодировать» два двоичных взаимоисключающих числа (w & b == 0) в троичной форме будет:

white_black_empty = lambda w, b: int(format(b, 'b'), base=3) + \
                                 int(format(w, 'b').replace('1','2'), base=3)

Вот все возможные 2-битные варианты:

white_black_empty(0b00, 0b00) == 0
white_black_empty(0b00, 0b01) == 1
white_black_empty(0b01, 0b00) == 2
white_black_empty(0b00, 0b10) == 3
white_black_empty(0b00, 0b11) == 4
white_black_empty(0b01, 0b10) == 5
white_black_empty(0b10, 0b00) == 6
white_black_empty(0b10, 0b01) == 7
white_black_empty(0b11, 0b00) == 8

Наблюдая, что int(format(w, 'b').replace('1','2'), base=3) на самом деле равно двойному int(format(w, 'b'), base=3) (например, 2022002 3 == 1011001 3 * 2), мы получаем решение, которое @ Марк Дикинсон разместил в комментариях выше:

white_black_empty = lambda w, b: int(format(b, 'b'), base=3) + \
                                 int(format(w, 'b'), base=3)*2
0 голосов
/ 07 ноября 2018

Самый быстрый способ сделать это, вероятно, с десятичным сложением:

a = 1100100
b = 10000001
result = int(str(a+2*b),3) #5357

Вы не найдете троичных операторов в python (или любом другом языке, который мне известен). Поскольку вам нужно идти выше побитовых операций, ваш следующий самый быстрый вариант - это целочисленное сложение, которое оптимизируется для каждого компьютера на Земле. для завершения.

Другие решения, которые преобразуются в троичные, чтобы выполнить это, потребуют от вас приведения назад и вперед к строкам, что занимает намного больше времени, чем десятичное сложение. Для этого требуется только одна строка, приведенная в конце, при условии, что вам даже нужна десятичная версия последнего троичного числа.

...