我有两个二进制整数,x0并且x1是8位(这样它们跨越从0到255).关于这些数字,这句话总是如此:x0 & x1 == 0.这是一个例子:
bx0 = 100 # represented as 01100100 in binary
bx1 = 129 # represented as 10000001 in binary
Run Code Online (Sandbox Code Playgroud)
所以我需要对这些数字进行以下操作.首先,将这些二进制表示解释为三元(基数为3)的数字,如下所示:
tx0 = ternary(bx0) # becomes 981 represented as 01100100 in ternary
tx1 = ternary(bx1) # becomes 2188 represented as 10000001 in ternary
Run Code Online (Sandbox Code Playgroud)
然后,1将三元表示中的所有内容交换tx1为2:
tx1_swap = swap(tx1) # becomes 4376, represented as 20000002 in ternary
Run Code Online (Sandbox Code Playgroud)
然后使用它们的三元版本OR来获得最终的组合数字:
result = ternary_or(tx0, tx1_swap) # becomes 5357, represented as 21100102 in ternary
Run Code Online (Sandbox Code Playgroud)
我不需要在任何时候保存三元表示,我只需要结果,例如result=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)
Run Code Online (Sandbox Code Playgroud)
以下是所有可能的 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
Run Code Online (Sandbox Code Playgroud)
通过观察它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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
251 次 |
| 最近记录: |