2017-06-18 53 views
-1

我知道你可以只使用一个整数并向上和向下计数,然后转换为十六进制字符串,但我需要使用大于最大值的整数(高达ffffffffffffffffffff或1208925819614629174706175 )。根据这些类型的数字,最有效的方法是什么?由于Java向上/向下十六进制(字符串)

+2

'java.math.BigInteger'并使用'BigInteger.toString(16)转换为十六进制字符串;' – rossum

+1

定义“最高效”。 – Andreas

回答

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亿个值,而忽略循环和所有其他需要的东西d一个由操作系统。再增加16个位,你需要超过1900万年来计算所有数据。

+0

非常糟糕的命名约定。 [Java命名约定](https://stackoverflow.com/documentation/java/2697/oracle-official-code-standard/9031/naming-conventions#t=201706181648276636093)适用于以大写字母开头的类名,字段名称以小写字母开头。你做的恰恰相反。 – Andreas

+0

@Andreas我不熟悉Java和Java命名约定。刚修好了 –

+0

'toHex()'不正确。在首次调用inc()之前调用'toHex()'将返回'00',而不是'0'。在第一次结转之前调用'toHex()'将返回'0ffffffffffffffff'。调用'inc()',然后'toHex()'将返回10,这肯定是不正确的。 – Andreas

0

最快的方法可能会保留一个char[]并与它计数。对于每个操作,您只需要更改90%情况下的最后一位数字。在9%的情况下,您需要更改两位数,在0.9%的情况下等。

转换为String只是一个简单的阵列副本,因此可以附加到StringBuilder

请注意,这样的优化很可能是无意义的。去一个BigInteger,节省自己的麻烦和错误,并报告回来,如果它太慢。

+0

存储在2^64的基数中,而且您还需要只更改十进制中大约18位数字的最后一个数字。这会慢很多。无论如何,这个柜台是无用的,因为它几乎不会溢出 –