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
评论关闭。