我知道你可以使用一个整数然后向上和向下计数然后转换为十六进制字符串,但我需要使用大于最大值的整数(最多为0xffffffffffffffffffff或1208925819614629174706175)。
什么是最有效的方式来计算这些类型的数字?
如果你想要一个80位计数器,那么你可以创建一个存储80位然后add from the low part to the high part (with carry)的结构
class Counter {
private long low; // 64 low bits of the counter
private short high; // 16 high bits
public void inc() {
low++;
if (low == 0) // wrapped around, which means there's a carry
high++; // add the carry to the high part
}
public String toHex() {
return String.format("%04X%016X", high & 0xffff, low);
}
}
如果你不想要前导0,那么改变这样的toHex
函数
if (low == 0)
return Long.toHexString(low);
else
return Integer.toHexString(high & 0xffff) + String.format("%016X", low);
但是,你can't count up to that maximum value in your whole life,因为只计算64位值你必须花费〜9223372036秒或292年,假设你的CPU可以在一秒钟内计算20亿个值而忽略循环以及操作系统需要完成的所有其他事情。再增加16位,你需要超过1900万年的时间来计算所有数据。
最快的方法可能是保持一个char[]
并用它来计算。对于每个操作,您只需要在90%的情况下更改最后一位数。在9%的情况下,您需要更改两位数,在0.9%的情况下,等等。
转换为String
只是一个简单的数组副本,因此附加到StringBuilder
。
请注意,这种优化很可能是无意义的。与BigInteger
一起去,省去麻烦和错误,并报告它是否太慢。