2017-06-18 58 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位數字的最後一個數字。這會慢很多。無論如何,這個櫃檯是無用的,因爲它幾乎不會溢出 –