前几天做的产品测试,发现内置最大的整数值只有10的9次方,没有实现超大整数的功能。现在海量计算和海量存储应用越来越多,而且已经有很多人实现了超大整数的存储和运算,调查了一些这方面的方法,根本上都是自定义一个多字节的数据结构,以便对程序语言的内置int型做扩展。自定义结构的方式尽管人人不同,但是本质上,都是选取某一种数学进制表示超大数,同时用链表或者数组的方式组织成大数的进制的位元。比如我们习惯的10进制,表示12345这个数时,其本质含义是
1×10^4+2×10^3+3×10^2+4×10^1+5×10^0
这里,10即使进制,10的n次方表示该位权为n,而权左边的系数就是位元,计算机中的16进制也是同样的道理。因此任意一个10进制数Ps,在进制S中,其位元为Ai,则可以用公式表示为:
Ps=A0S^0+A1S^1+A2S^2+...+An-1S^(n-1)
大数的实现原理就是设定一个进制S,然后使用链表或者数组,从表头开始每一个元素表示S进制从低位到高位(或者相反)的各个权的位元。这就是大数的存储方式。大数的各种,最基本的是四则运算,本质上也是我们小学学的方法,由低向高,相同权的位元对应着逐个计算。因此,仅从数据结构上考虑,大数的各种计算性能差异就取决与进制的选择了。
通过调查,前人大数实现的方法主要有:
1、字符串表示法:即一个大数比如12345,就用字符串"12345”方式存储,这是10进制的,优点是表示简单易于理解,但计算时总需要做字符到数字的映射,效率低且浪费空间。
2、10进制表示法,包括BCD编码表示,计算机上每个字节有16个存储状态,该方法只用其中0x00-0x09这10个状态,用1个或者半个字节表0-9,这样最接近人的理解,且计算也不麻烦,效率上,在32位机中,每次运算需要把位元从一个或者半个字节转成int型。并且显而易见,存储时有浪费。
3、10^n进制表示法,即用一个或几个字节表示从0-10^n的数,这样做的目的是提高效率并且节省空间,因为有时10进制大数可能是数百万位的,节省空间很必要。如果