在不同的基数之间转换数字是否有任何实际用途?

时间:2011-04-15 05:07:51

标签: numbers

我知道我们需要将十进制,八进制和十六进制转换为二进制,但我很困惑将十进制转换为八进制或八进制转换为十六进制或十进制转换为十六进制。 我们为什么需要这些类型的转换?

6 个答案:

答案 0 :(得分:5)

不同的基础有利于不同的目的。

  • 十进制显然是大多数人都知道如何处理的,因此最终用户可以输出实际数量。
  • 十六进制是短的,每个字节的正常比例恰好为2个字符,所以它有利于以类型格式表示像SHA1哈希或私钥等大数字,特别是因为这些数字并不真正代表数量,因此用户无需将其理解为数字。
  • Octal主要是出于传统原因 - 例如,UNIX文件权限代码通常表示为八进制数,因为每个数字三位与UNIX权限编码方案的每个用户类别的三位很好地对应。

有时人们会想要在一个基地中使用数字,以达到需要另一个基数的目的。因此,可用的各种转换功能。但事实上,我的经验是,在实践中,你几乎从不会从一个基数转换到另一个基数,除了将数字从一些非二进制基数转换为二进制数(以您选择的语言形式的原生积分类型)并退出进入你需要输出的任何基础。大多数情况下,从一个非二进制基数到另一个非二进制基础是在了解基数并了解不同碱基中的数字或使用十六进制输出进行调试时。即使这样,如果一台计算机做到这一点,主要的方法是转换为二进制,然后退出,因为当前的计算机本身就擅长处理基数为2而对其他任何东西都不太好。

您看到实际存储和操作十进制数字的一个重要位置是在某些财务应用程序或其他重要的情况下保留“小数位数”级别精度。有时定点算术可以用于货币,但并非总是如此,如果它不使用二进制浮点是一个坏主意。较旧的系统实际上已经以二进制编码的十进制算术的形式内置了对此的支持。在BCD中,每4位作为十进制数字,因此您放弃每4位存储的一大块,以换取在非计算世界的选择基础上保持您的精确度。

奇怪的是,其他基础有一个常见的用例,有点隐藏。支持大量数据的现代语言(例如Python 2.x的long类型或Java的BigIntegerBigDecimal类型)通常会将数字内部存储在一个数组中,每个元素都是一个数字基础。然后他们实现了他们支持的数学字符串的数学运算。真正有效的bigint实现实际上可以使用接近2 ^的基数(机器本机字大小的位);基本的2 ^ 64数字显然不可能以这种形式有用地输出,但是以该大小的块进行计算最终会充分利用空间和CPU。 (我不知道这是不是最好的基础;最好使用一半数量的基数来简化从一个数字到下一个数字的溢出处理。自从我编写自己的bigint并且我从未实现过一段时间以来乘法和除法的更快/更复杂的版本。)

答案 1 :(得分:3)

MIME使用十六进制系统进行Quoted Printable编码(例如Unicode中的邮件主题)基于abd 64的系统进行Base64编码。

答案 2 :(得分:2)

如果您的工作场所陷入IPv4 CIDR - 您将会做很多垃圾箱 - > hex - >十进制转换管理大多数网络设备,直到你记住它们(或只是使用一些随机,简单的工具)。

即使这种用法有点寥寥可数 - 大多数企业只采用懒惰的“/ 24所有”方法。

如果你做了很多图形工作 - 你有可能想要在系统之间转换颜色,并且需要从hex转换 - >但是......大多数工具都内置了颜色选择器。

我认为没有任何实际的理由能够做到这一点,而不是真的很简单,没有必要学习如何去做。 :)

...除非出于某种原因,否则你正试图在脑海中进行尾数二进制数学运算。

答案 3 :(得分:1)

所有这些基地都有其用途。十六进制尤其可用作二进制的简写。每个十六进制数字相当于4位,因此您可以将完整的32位值写为8个十六进制数字的字符串。同样,八进制数字相当于3位,并且经常用作Unix文件权限之类的简写(777 =设置读取,写入,执行用户/组/其他位)。

没有一个基地是特别的 - 他们都有他们(模糊)的用途。十进制对我们来说很特别,因为它反映了人类的经验(10个手指),但这确实是唯一的原因。

答案 4 :(得分:1)

真实世界的用例:程序打印十进制的错误代码,从数据库或互联网获取您需要十六进制格式的信息,因为错误“数字”的位传达了您需要查看的额外信息二进制。

答案 5 :(得分:0)

我偶尔会有这种用法。一个用例是一个小应用程序,允许用户想要将十进制转换为八进制......就像你可以使用大量的计算器。

但我不确定我理解问题的重点。标准库通常不提供String toOctal(String decimal)之类的方法。相反,您通常会将十进制字符串转换为原始整数,然后从原始整数转换为(例如)八进制字符串。