如何将两个二进制数字合并为一个三进制数字

时间:2018-11-07 19:51:46

标签: python ternary

我有两个8位二进制整数x0x1(因此它们的范围是0到255)。对于以下数字,此陈述始终正确:x0 & x1 == 0。这是一个示例:

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

因此,我需要对这些数字执行以下操作。首先,将这些二进制表示形式解释为ternary(以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 :(得分:2)

最快的方法可能是十进制加法:

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

您将无法在python(或我知道的任何其他语言)中找到三元运算符。由于您需要进行按位运算,因此,第二个最快的选项是整数加法,这是地球上每台计算机都经过优化的完成。

要完成此操作,其他转换为三进制的解决方案将要求您前后转换为比十进制加法要长得多的字符串。假设您甚至需要最终三进制数的十进制版本,那么最后只需要转换一个字符串即可。

答案 1 :(得分:1)

重新解释像我这样的假人:

一种在三进制中“编码”两个二进制互斥数字(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),我们得到@Mark Dickinson在上面的评论中发布的解决方案:

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