Java以十六进制计数/向下计数

时间:2017-06-18 16:19:33

标签: java performance count hex bigint

我知道你可以使用一个整数然后向上和向下计数然后转换为十六进制字符串,但我需要使用大于最大值的整数(最多为0xffffffffffffffffffff或1208925819614629174706175)。

最有效的方法是计算这些类型的数字?

2 个答案:

答案 0 :(得分:1)

如果你想要一个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万年来计算所有数据。

答案 1 :(得分:0)

最快的方式可能是保持char[]并用它来计算。对于每个操作,您只需要在90%的情况下更改最后一位数。在9%的情况下,您需要更改两位数,在0.9%的情况下,等等。

转换为String只是一个简单的数组副本,因此附加到StringBuilder

请注意,这种优化很可能是无意义的。选择BigInteger,省去麻烦和错误,并报告它是否太慢。