所以十六进制是这样表示的:0x[0..F]+
十进制整数表示如下:[0..9]+
因此对于十进制数 15
,十六进制版本是 0xF
,它长一个字符。显然这只是因为您必须添加 0x
,但这是编写十六进制文字的必要部分。
但是,在较大的值下,十六进制使用的字符少于十进制,因为它是以 16 为底,而不是以 10 为底。
例如
0xFFFFFFFFFFFFFFFF
比
短1152921504606846975
什么时候十六进制比十进制短?有计算这个数字的漂亮小算法吗?
我已将此标记为面试问题,尽管它不是。我认为这会是一个很好的选择。
最佳答案
表示数字 n 所需的某些基数 B 中的位数由下式给出
⌈logB(n + 1)⌉
这意味着十六进制数在任何时候都比十进制数更有效
⌈log16(n + 1)⌉ < ⌈log10(n + 1)⌉
如果您有一些数字 n 需要测试,您可以将其代入此公式以查看是十六进制还是十进制更有效。
但让我们看看是否可以绘制出您需要一定数量的数字来表示某物的范围。我们在这里得到这张表:
Num Digits Decimal Cutoff Hex Cutoff
----------------------------------------------------
1 0 0
2 10 16
3 100 256
4 1000 4096
5 10000 65536
6 100000 1048576
7 1000000 16777216
请注意,当我们达到六位十进制数时,将数字写成十进制数永远不会更有效率,因为六位十进制数最多为 999999,而六位十六进制数最多为 16777215。因此从 100000 开始, 你最好用十六进制而不是十进制来写这个数字。
编辑:因为您将 0x 字符计为所需总位数的一部分,所以您将寻找第一个数字
⌈log16(n + 1)⌉ + 2 < ⌈log10(n + 1)⌉
在这种情况下,表格如下所示:
Num Digits Decimal Cutoff Hex Cutoff
----------------------------------------------------
0 100 1
1 1000 16
2 10000 256
3 100000 4096
4 1000000 65536
5 10000000 1048576
6 100000000 16777216
7 1000000000 268435456
8 10000000000 4294967296
9 100000000000 68719476736
10 1000000000000 1099511627776
11 10000000000000 17592186044416
在这种情况下,两个表示相交的点是 1099511627776,它只需要 11 个十六进制数字,但需要 13 个十进制数字。从现在开始,您总是至少可以使用十六进制。一旦达到 10000000000000,最好使用十六进制。
希望这对您有所帮助!
关于math - 在什么时候数字的十六进制表示比十进制占用更少的字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9458614/