ActionScript中uint64的字符串转化toString()原理及算法

ActionScript无法表示Uint64,一般用两个Uint32分别表示高位和低位,这两个Uint32如何还原转化成“字符串”呢,原理及算法如下。

一、      已知

Class Uint64

{

Uint32 high;

Uint32 low;

};

即大整数 Uint64 = high*2^32 + low;

二、      求解

Uint64.toString();

三、      原理

将Uint64除以10,得到最后一位的char值,同时更新Uint64。

四、      步骤

步骤一:求末位char

末位char =>

Uint64 % 10 =>

(High*2^32 + low) % 10 =>

(High*2^32 % 10) + (low % 10) => 注:之和如果大于10,还要模10

(High % 10)*(2^32 % 10) + (low % 10) => 注:之和如果大于10,还要模10

(high % 10)*6 + (low % 10) => 注:之和如果大于10,还要模10

结论:

末位char = ((low%10) + (high%10)*6)%10

红色部分解释如下:

2^1 = 2

2^2 = 4

2^3 = 8

2^4 = 16

2^5 = 32

即2^1 % 10 = 2^5 % 10

于是=>

2^32 % 10 =>

2^3 * 2^29 % 10 =>

8*2 % 10 => 6

步骤二:更新high/low

目的:递归求解末位char,必须更新原high/low

不妨设high%10 = temp

即high = 10*a + temp

去掉末位char之后,原Uint64相当于除了个10剩下的Uint64

新Uint64 = 旧Uint64/10

新low = 新Uint64 % 2^32 => 即新的低32位

新high = 新Uint64 / 2^32 => 即新的高32位

一步步来

新low = 新Uint64 % 2^32 =>

(旧Uint64/10) % 2^32 =>

((High * 2^32 + low)/10)%2^32 =>

(((10a + temp) * 2^32 + low)/10)%2^32 =>

(Temp/10)*2^32 + low/10 =>

((high%10)/10)*2^32 + low/10

新high =新Uint64 / 2^32 =>

(旧Uint64/10) / 2^32 =>

((High * 2^32 + low)/10)/2^32 =>

High/10

结论:

New_low = ((high%10)/10)*2^32 + low/10

New_high = high / 10

五、      算法

说明:

实现语言为ActionScript3;

类用于表示Uint64,并且提供函数求末位char、更新high、low;

函数用来实现Uint64.toString();

	public class shenjian64
	{
		public var low:uint;
		public var high:uint;
		public function shenjian64(high:uint = 0, low:uint = 0)
		{
			this.high = high;
			this.low = low;
		}

		public function div(n:uint = 10):uint
		{
			//这个值就是temp
			const temp:uint = high % n;
			//求末位char
			const mod:uint = (low % n + temp* 6) % n;
			//更新高位
			high /= n;
			//更新低位
			low = (temp* Number(0x100000000) + low) / n;

			return mod;
		}
	}

	public function uint64_to_string(high:uint, low:uint):String
	{
		var digitChars:Array = [];
		var my64:shenjian64 = new shenjian64(high, low);
		do{
			//求末位char
			var digit:uint = my64.div();
			digitChars.push(digit);
			//只要高低位不为0,就继续求末位char
		}while (my64.low != 0 || my64.high != 0);

		return digitChars.reverse().toString();
	}

测试如下:
low=11111111111;
high=22222222222;
trace(uint64_to_string(high, low));

结果为:
3209997321907870151

评论关闭。