【算法基础】平衡三进制(Balanced Ternary)
【算法基础】平衡三进制(Balanced Ternary)
平衡三进制(Balanced Ternary)是一种独特的数字符号系统,它使用-1、0和1作为每一位的数字,通过这种特殊的表示方式,可以实现不使用负号的符号表示。本文将详细介绍平衡三进制的概念、特点以及如何将其应用于实际的数值转换中。
平衡三进制(Balanced Ternary)
介绍
这是一个不太标准的数字符号系统(numeral system)。它的特点是每一位数字可以是-1、0和1。它是一个基于三进制的数字符号系统。因为使用-1来作为一个数字不太方便,我们接下来会使用字母Z来代替-1。图片里展示的是一台使用这种系统的计算机。
下面是一些使用这种平衡三进制来表示的数字:
0 0
1 1
2 1Z
3 10
4 11
5 1ZZ
6 1Z0
7 1Z1
8 10Z
9 100
这种符号系统允许你在书写符号的时候不使用前置的负号:在将正数转换成负数时,你需要将每一位数字转置(1变成Z,Z变成1)。
-1 Z
-2 Z1
-3 Z0
-4 ZZ
-5 Z11
注意到,负数都是Z开头,正数都是1开头。
转换算法
通过将一个给定的数转换成普通的三进制形式,我们很容易将它表示成平衡三进制的形式。当一个数以三进制的形式表示时,它的每一位都是0、1、2中的一个数。要将它转换成平衡三进制,我们从低位开始,如果遇到了0或1,那么这一位保持不变,如果遇到数字2,那么将1变成Z,并且让下一位加1。如果加1后变成了数字3,3应该变成0,并且下一位要加1。
例1:将64转换成平衡三进制。首先我们先将64写成普通的三进制数形式:
6410 = 021013
我们从最右边一位开始处理:
- 1,0,1被跳过,保持不变。
- 2被转换成Z并且左边以为加1,我们得到了1Z101。
最终的结果是1Z101。
我们通过把每一位的权重加起来把它转换成普通的10进制数字:
1Z101 = 81⋅1 + 27⋅(−1) + 9⋅1 + 3⋅0 + 1⋅1 = 6410
例2:将237平衡三进制。首先我们先将237写成普通的三进制数形式:
23710 = 222103
我们从最右边一位开始处理:
- 0,1被跳过,保持不变。
- 2被转换成Z,左边一位加1,我们得到了23Z10。
- 3被转换成0,左边一位加1,我们得到了30Z10。
- 3被转换成0,左边以为加1,我们得到了100Z10。
最终的结果是100Z10。
我们将它转换成普通的10进制数字:
10Z10 = 243⋅1 + 81⋅0 + 27⋅0 + 9⋅(−1) + 3⋅1 + 1⋅0 = 27310