Python 如何将两个二进制数合并成一个三进制数

Python 如何将两个二进制数合并成一个三进制数,python,ternary,Python,Ternary,我有两个二进制整数,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 repr

我有两个二进制整数,
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
然后,将
tx1
的三元表示形式中的所有
1
交换到
2

tx1_swap = swap(tx1) # becomes 4376, represented as 20000002 in ternary
然后对其使用三元版本的
,以获得最终的组合编号:

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

我不需要在任何时候保存三元表示,我只需要结果,例如
result=5357
。当然,我可以通过将数字转换成二进制,转换成三元,等等来编写代码。。但我需要这个操作速度快,因为我在代码中多次这样做。用python实现这一点的快速方法是什么

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

a = 1100100
b = 10000001
result = int(str(a+2*b),3) #5357
在python(或我所知道的任何其他语言)中都找不到三值运算符。因为需要进行位运算,所以下一个最快的选项是整数加法,地球上的每台计算机都经过优化以完成该运算


其他转换为三元的解决方案需要来回转换字符串,这比十进制加法要长得多。假设您甚至需要最终三元数的十进制版本,那么这只需要在末尾强制转换一个字符串。

请重新解释像我这样的傻瓜:

将两个二进制互斥数(
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)
(例如,20220023==10110013*2)的两倍,我们得到了@Mark Dickinson在上述评论中发布的解决方案:

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

祝你好运,这听起来不像是任何内置的优化操作。到目前为止,你做了哪些尝试,哪些结果让你不满意?你试过你的基本案例(转换和再次转换)并计时了吗?发布一个例子以及你需要在这个例子下的时间会很有用。整个事情听起来很奇怪。用三元数中的2替换所有1的实际应用程序是什么?
int(格式(bx0,“b”),base=3)+2*int(格式(bx1,“b”),base=3)
实现了您的要求吗?