当我们使用基数2时,二进制,计数每个位具有不同的正值(符号位除外),例如:
0 0 0 0 0 0 0
64 32 16 8 4 2 1
现在我需要使用3的签名权限计算范围-120 - 120
,我的"位"是:
0 0 0 0 0 0 0 0 0 0
-81 -27 -9 -3 -1 1 3 9 27 81
除了记住哪个组合导致程序开头的哪个值,我应该如何找到一个实际计算这些位的方法呢?
在更多的数学术语中,给定一个数字n
我应该如何找到3比特" 3比特的权力组合。等于n
。
作为解决问题的另一种方法,代替这些编号格式之间的直接转换,有可能给定n
已经转换为此" 3"的权力格式,我可以直接找到这种格式的n+1
(不转换回十进制,添加1然后转换回来)。但是我也不知道如何朝着这个方向前进。
由于主要项目的核心是一个更高级的文件转换器,我受限于这种表示数字的方法,这是我需要支持使用的文件类型之一。
P.S。如果这是错误的论坛,请指导我正确的论坛。我不确定自己应该在哪里提出这样的问题。
编辑:0
的表示没有设置位,我相信所有0
,并且只要其中一个位被设置,其值就会被添加到数字中。
答案 0 :(得分:3)
这是在Setun'中使用的balanced ternary system。电脑。每个"数字" (-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+++