以 3 的有符号幂计数

Counting with signed powers of 3

当我们使用以2为基数的二进制来计数时,每个位都有不同的正值(符号位除外)例如:

 0   0   0  0  0  0  0 
64  32  16  8  4  2  1

现在我需要使用 3 的有符号幂在 -120 - 120 范围内计数,我的 "bits" 是:

  0     0    0    0    0   0   0   0    0    0
-81   -27   -9   -3   -1   1   3   9   27   81

除了在程序开始时记住什么组合导致哪个值之外,我应该如何找到一种方法来使用这些位进行实际计数?

用更多的数学术语来说,给定一个数字 n 我应该如何找到 "powers of 3 bits" 的组合等于 n

作为解决问题的另一种方法,而不是在这些编号格式之间进行直接转换,鉴于 n 已经转换为这种 "powers of 3" 格式,我可以找到 n+1直接用这种格式(不转回十进制,加1再转回)。但是我也不知道如何朝这个方向前进。

我受限于这种表示数字的方法,因为主要项目是其核心,一个更高级的文件转换器,这是我需要支持使用的文件类型之一的格式。

P.S。如果这是错误的论坛,请指导我到正确的论坛。我自己也不确定这种问题到底应该问哪里。

编辑:0 的表示没有设置任何位,我相信所有 0s,只要其中一个位被设置,它的值就会添加到数字中。

这是在 Setun 的电脑上使用的balanced ternary system。每一个"digit"(-1,0,1)被称为trit类似于bit.

在没有硬件支持的情况下,您可以使用迭代在该系统中翻译数字 - 获得参与给定值的三 (p) 的最大幂,用当前符号填充相应的 trit,从值中减去 p,调整符号并继续。

请注意,MST=1(最重要的 trit)包含在从 (3^n-3^(n-1)-...-1)(3^n+3^(n-1)+...+1) 的值中。例如,2-nd trit (9) 是最旧的集合,取值范围为5 到13。括号中的值为等比级数和,存在简式。

所以我们可以从第 0 个 trit 移动到更重要的 trit,重新计算限制。工作 Delphi 代码,检查 -40..40 限制

 function ToBTS(Value: Integer): TArray<Integer>;
  var
    p, sgn, t: Integer;

    procedure AdjustSign();
    begin
      if value < 0 then begin
         sgn := -sgn;
         value := -value;
      end;
    end;

  begin
   SetLength(Result, 8);
   for t := 0 to 7 do
     Result[t] := 0;
   sgn := 1;
   p := 1; // power of three
   t := 0; // trit number

   AdjustSign();
   while p * 3 - 1 < 2 * value do begin //forward traversal
     p := p * 3;
     t := t + 1; //move to more significant trit
    end;

   while value <> 0 do begin  
      Result[t] := sgn;
      value := value - p;
      AdjustSign();
     //backward traversal
      while (value > 0) and (p - 1 >= 2 * value) do begin
        p := p div 3;
        t := t - 1; //move to less significant trit
      end;
    end;
 end;

输出(+ 为 1,- 为 -1)

-13 0---
-12 0--0
-11 0--+
-10 0-0-
-9 0-00
-8 0-0+
-7 0-+-
-6 0-+0
-5 0-++
-4 00--
-3 00-0
-2 00-+
-1 000-
0 0000
1 000+
2 00+-
3 00+0
4 00++
5 0+--
6 0+-0
7 0+-+
8 0+0-
9 0+00
10 0+0+
11 0++-
12 0++0
13 0+++