【问题标题】:How to interpret a binary integer as ternary (base 3)?如何将二进制整数解释为三进制(以 3 为底)?
【发布时间】:2012-03-15 13:57:17
【问题描述】:

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

0101 (4 + 1 = 5)

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

0101 ( 9 + 1 = 10 )

如何在具有 1. 最少内存读取和 2. 最少硬件指令的现代 CPU 或 GPU 上做到这一点?

【问题讨论】:

  • 您使用什么语言?数字的数据类型是什么?数组?一个字符序列?
  • 二进制数是怎么给出的?作为一个整数?还是一个数字数组?
  • “binary”表示只有数字 0 和 1,“ternary”表示只有数字 0、1 和 2。我在 CPU 寄存器中有一个二进制整数,我希望该寄存器包含表示输入值的二进制整数,解释为三进制(以 3 为底)数。例如,如果输入是二进制 10,则输出应该是二进制 11,因为输入被解释为十进制值为 3 的三进制数。
  • @bmcnett:没有神秘的陌生人。为了清楚起见,SO 社区的另一位用户编辑了您的问题。现在比原来的版本好多了。问题(和答案!)没有锁定,其他人也可以改进,不仅仅是原始海报。
  • 请尝试回答其他问题,由 cmets 提出(例如,您提到 CPU 和 GPU,但没有提到您使用的语言,是汇编语言、C 语言还是其他语言?)。只提 CPU 并不能帮助别人理解你。如果没有处理单元,无论如何都很难运行代码......

标签: math binary numbers bit-manipulation


【解决方案1】:

使用蓄能器。 C-ish 伪代码:

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

要加快乘以 3 的速度,您可以使用 ((accumulator

如果您的数字中有很大一部分在相对较小的范围内,您还可以预先生成一个查找表以使从 base2 到 base3 的转换是瞬时的(使用 base2 值作为索引)。您还可以使用查找表来加速查找前N位数字,因此您只需为剩余数字的转换付费。

【讨论】:

    【解决方案2】:

    这个 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); 
    }
    

    循环在我的 32 位 Intel 机器上编译成这个机器代码:

     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) 
    

    对于示例值(十进制 5000 = 二进制 1001110001000),它产生的三进制值是 559899。

    【讨论】:

      猜你喜欢
      • 2022-12-07
      • 1970-01-01
      • 2017-03-13
      • 2018-07-12
      • 1970-01-01
      • 2018-08-08
      • 1970-01-01
      • 2012-04-28
      • 2016-10-05
      相关资源
      最近更新 更多