Math 如何将二元整数解释为三元整数(以3为基数)?

Math 如何将二元整数解释为三元整数(以3为基数)?,math,binary,numbers,bit-manipulation,Math,Binary,Numbers,Bit Manipulation,我的CPU寄存器包含一个二进制整数0101,等于十进制数5: 0101(4+1=5) 我希望寄存器包含等于十进制10的二进制整数,就像原始二进制数0101是三进制数(基数3),每个数字恰好是0或1: 0101(9+1=10) 如何在当代CPU或GPU上使用1执行此操作。最小内存读取数和2。最少的硬件指令?使用累加器。C-ish伪代码: var accumulator = 0 foreach digit in string accumulator = accumulator * 3 + (d

我的CPU寄存器包含一个二进制整数
0101
,等于十进制数5:

0101(4+1=5)

我希望寄存器包含等于十进制10的二进制整数,就像原始二进制数0101是三进制数(基数3),每个数字恰好是0或1:

0101(9+1=10)


如何在当代CPU或GPU上使用1执行此操作。最小内存读取数和2。最少的硬件指令?

使用累加器。C-ish伪代码:

var accumulator = 0
foreach digit in string
   accumulator = accumulator * 3 + (digit - '0')
return accumulator

要加速乘法3,您可以使用((累加器此C程序将执行此操作:

#include <stdio.h>

main() 
{
 int binary = 5000; //Example
 int ternary = 0;
 int po3 = 1;

 do
   {
    ternary += (binary & 1) * po3;
    po3 *= 3;    
   }
 while (binary >>= 1 != 0);

 printf("%d\n",ternary); 
}

对于示例值(decimal 5000=binary 1001110001000),它产生的三值是559899。

您使用的语言是什么?数字的数据类型是什么?数组?字符序列?二进制数是如何给出的?作为int?还是作为数字数组?“binary”表示只有数字0和1,而“Trimal”表示仅包含数字0、1和2。我在CPU寄存器中有一个二进制整数,我希望该寄存器包含一个二进制整数,该二进制整数表示解释为三进制(基数3)的输入值数字。例如,如果输入是二进制10,则输出应该是二进制11,因为输入被解释为十进制值为3的三元数。@bmcnett:没有神秘的陌生人。SO社区的另一位用户编辑了您的问题以使其更清晰。现在比原始版本好得多。问题(和答案!)没有被锁定,其他人也可以改进,不仅仅是原始海报。请尝试回答评论中提出的其他问题(例如,您提到CPU和GPU,但没有提到您使用的语言,是汇编语言、C语言还是其他语言?).仅仅提到CPU并不能帮助其他人理解您。没有处理单元,无论如何都很难运行代码。。。
 do
   {
    ternary += (binary & 1) * po3;
0041BB33  mov         eax,dword ptr [binary]  
0041BB36  and         eax,1  
0041BB39  imul        eax,dword ptr [po3]  
0041BB3D  add         eax,dword ptr [ternary]  
0041BB40  mov         dword ptr [ternary],eax  
    po3 *= 3;    
0041BB43  mov         eax,dword ptr [po3]  
0041BB46  imul        eax,eax,3  
0041BB49  mov         dword ptr [po3],eax  
   }
 while (binary >>= 1 != 0);
0041BB4C  mov         eax,dword ptr [binary]  
0041BB4F  sar         eax,1  
0041BB51  mov         dword ptr [binary],eax  
0041BB54  jne         main+33h (41BB33h)