math - 在什么时候数字的十六进制表示比十进制占用更少的字符?

标签 math decimal hex

所以十六进制是这样表示的: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/

相关文章:

c - 用C写十六进制(字节)

Python 无法返回最终值

algorithm - 对数是如何编程的?

algorithm - 以任意精度计算两个阶乘比率的有效方法是什么?

C#:检查一组枚举值的最佳方法?

java - printf只在java中打印小数部分

android - Nfc-v 无法确定如何检索与其他应用程序相同的数据

c++ - 将十六进制转换为十进制 C++

C 指针位置,十进制和十六进制

C++自动更新程序