我知道你可以只使用一个整数并向上和向下计数,然后转换为十六进制字符串,但我需要使用大于最大值的整数(高达ffffffffffffffffffff或1208925819614629174706175 )。根据这些类型的数字,最有效的方法是什么?由于Java向上/向下十六进制(字符串)
回答
如果你想要一个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万年来计算所有数据。
非常糟糕的命名约定。 [Java命名约定](https://stackoverflow.com/documentation/java/2697/oracle-official-code-standard/9031/naming-conventions#t=201706181648276636093)适用于以大写字母开头的类名,字段名称以小写字母开头。你做的恰恰相反。 – Andreas
@Andreas我不熟悉Java和Java命名约定。刚修好了 –
'toHex()'不正确。在首次调用inc()之前调用'toHex()'将返回'00',而不是'0'。在第一次结转之前调用'toHex()'将返回'0ffffffffffffffff'。调用'inc()',然后'toHex()'将返回10,这肯定是不正确的。 – Andreas
最快的方法可能会保留一个char[]
并与它计数。对于每个操作,您只需要更改90%情况下的最后一位数字。在9%的情况下,您需要更改两位数,在0.9%的情况下等。
转换为String
只是一个简单的阵列副本,因此可以附加到StringBuilder
。
请注意,这样的优化很可能是无意义的。去一个BigInteger
,节省自己的麻烦和错误,并报告回来,如果它太慢。
存储在2^64的基数中,而且您还需要只更改十进制中大约18位数字的最后一个数字。这会慢很多。无论如何,这个柜台是无用的,因为它几乎不会溢出 –
- 1. JAVA转换十六进制字符串
- 2. 字符串为十六进制和十六进制转换为字符串
- 3. 将字符串转换为十六进制到十六进制
- 4. 转换十六进制字符串十六进制值
- 5. 十六进制字符串到十六进制整数
- 6. Java - 十六进制字符串表示为整数十六进制
- 7. 将十六进制数字向下连接到文本框的字符串
- 8. Python - 以十六进制数向上
- 9. 从十六进制字符串转换为十六进制字符数组
- 10. 十六进制字符串到二进制字符串
- 11. Ruby:十六进制字符串到二进制字符串
- 12. 将浮点数向量转换为十六进制/二进制字符串
- 13. Python十六进制字符串?
- 14. 长到十六进制字符串
- 15. 解压字符串以十六进制
- 16. 巴什 - 十六进制字符串
- 17. 字符串到十六进制
- 18. SQL十六进制字符串比较
- 19. 十六进制字符串压缩
- 20. SHA1哈希十六进制字符串
- 21. 仅显示十六进制字符串
- 22. 十六进制字符串为整数
- 23. 字符串到十六进制值
- 24. 十六进制字符串SWI-Prolog的
- 25. PHP字符串为十六进制
- 26. 十六进制字符串到NSString
- 27. 匹配十六进制字符串GAWK
- 28. 十六进制ASCII字符串转换
- 29. 打印十六进制字符串
- 30. 十六进制值的字符串格式为十六进制数字排序
'java.math.BigInteger'并使用'BigInteger.toString(16)转换为十六进制字符串;' – rossum
定义“最高效”。 – Andreas