Math 如何将二元整数解释为三元整数(以3为基数)?
我的CPU寄存器包含一个二进制整数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
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)