十进制中每位数多少位[关闭]


28

我将向一小群人介绍计算中的编号系统,并想知道十进制系统中每位有多少位,例如:

  • 十六进制(基数16)-4位
  • 八进制(以8为底)-3位
  • 二进制(以2为底)-1位
  • 十进制(以10为底)-?

7
直觉:假设您要查找的是d,它覆盖一位小数,范围为0..93*d位表示三个十进制数字,允许您表示范围内的整数0..999。整个十位(现在考虑二进制)的范围为0..1023。999接近1023,但少了一点。因此,您可能会期望d小于10/3。
卡米尔Maciorowski

5
这篇文章似乎更适合Stack Overflow,而不是Super User。
gmarmstrong17年

21
@gmarmstrong:我会争辩Mathematics.SE(或可能是SoftwareEngineering.SE)。这与编程问题没有直接关系。
扁平化的

10
@Flater:数学绝对是正确的地方,因为这基本上是信息论
101。– MechMK1

7
不知道这一点是没有耻辱的,但是如果不是这样的人可能不是教授数字系统的最佳人选。
WGroleau

Answers:


96

您正在寻找的是基于2的对数10,它是3.32192809489左右的无理数。

不能为十进制数字使用整数位数的事实是为什么许多在十进制系统中易于表达的分数(例如1/5或0.2)是不可能的(不难:真的)的根本原因不可能)以二进制形式表示。在评估浮点算术中的舍入误差时,这一点很重要。


评论不作进一步讨论;此对话已转移至聊天
DavidPostill

20

换句话说,这些系统中的一位数字中包含多少信息。

对于基数2,基数4,基数8,基数16和其他2 N个基数,答案是显而易见的,因为在2 N的基数中,每个数字都可以精确地用N个数字表示。

给定2 N,您如何得到N?好吧,您使用基于2的对数,这是幂的倒数。

  • log 2 2 = 1(以2为底的每位1位)
  • log 2 4 = 2(以4为底的每位2位)
  • log 2 8 = 3(以8为底的每位3位)
  • log 2 16 = 4(以16为底的每位4位)

不是K的幂的基于K的对数不是基数。特别是:

  • log 2 10 = 3.321928094887362347870319429489390175864831393024580612054 ...

这个数字可能看起来令人困惑,但实际上有一些用途。例如,它是一个十进制数字的

不过,对于您的情况,我认为此值没有任何用处。@Christian的答案很好地解释了原因。


8

关于位的主题:

很抱歉,这个问题被误导了。您不会以这种方式使用位。位是二进制数字。您可以将十进制数10转换为二进制1010(8 + 2),因此需要4位来表示十进制值10。


2的幂

通过使用二进制(2),八进制(8)和十六进制(16)作为示例,您陷入了陷阱,因为它们都是2的幂,因此您可以按位来考虑它们,而10并不是2的幂,因此它不能很好地工作。


18
这个问题没有被误导。在信息论的主题中,以这种方式谈论比特是完全正常的。然后Eugen Rieck的答案是一个很好的答案。

2
我建议您提到BCD(二进制编码的十进制),在电子产品中通常用4位表示。实际上,用于表示十进制数的位数通常为4,但这取决于实现方式。
davidmneedham

1
@DavidStockinger对,这取决于是理论问题还是实施问题。
davidmneedham

2
ln(10)/ ln(2)是理论答案。4位是可能的实现答案。
davidmneedham

2
@davidmneedham不,大多数数字以二进制存储。BCD用于罕见的特殊用途,但是大多数编码是整数或浮点十进制。在这些系统中,对数答案是正确的答案,它给出了最少的位数来存储给定十进制长度的所有数字(向上舍入),并解释了为什么给定位数不存储固定数目的十进制数字。
杰克·艾德利

7

BCD-二进制编码的十进制每位使用4位,与十六进制相同。

https://zh.wikipedia.org/wiki/二进制编码的十进制


除了“ BCD”通常用于指代6位字符编码。
Daniel R Hicks

@MrLister-en.wikipedia.org/wiki/BCD_(character_encoding
Daniel R Hicks

@DanielRHicks啊,好的。维基百科说它在1950年代末和1960年代初(即在EBCDIC发明之前)就使用过,所以我不为我从未听说过它感到羞耻。即使我现在意识到EBCDIC的名称也源于此!无论如何,术语BCD仍然不是“经常使用”来指代您所说的编码。
李斯特先生,2017年

3

使用位意味着2的幂,因此,正如其他人所说的那样,您不容易浪费10个位就将其压缩为字节。常见的解决方案是每个十六进制使用4位,并浪费表示为AF的6个状态。有趣的是,这样做是在进行十进制数学运算-它不是整洁而简单的。

一个有用的教学思路可能是比较Micky Mouse可能如何开发计数系统,因为他的每只手只有4个手指-这自然会导致基于八进制的系统。


我相信您是在回答中将十六进制表示为具有AF值的十六进制
user92592

@ user92582是的,TA。已更正。
davidgo '17

您可以使用这些“浪费”的6种状态来编码小数点,负数,序列终止符等。至于十进制数学……这不是整齐的,而是简单的?只需编写一些代码来做我们教小孩子的事情即可:p
Kaithar

@kaithar-我不认为您的建议是正确的,因为其中任何一项操作都将需要全部或更多的时间,而您尚无此操作。
davidgo

1
不知道“ 10位”将在何处形成。10位= 1024值。十进制数字只有10个可能的值。
MSalters

3

这可能是一个过分的简化,但取决于您要问的问题。
(答案基本上是八进制或十六进制)

我也不认为小数位是位,因为在实际使用中位没有小数。

问题1:您可以用十进制数字表示多少位

A1:您可以用一个十进制数字表示3位信息:

最常见的方案是带包装的直接二进制,其中0 = 8 = 000和1 = 9 = 001。但是您可以使用任何方案,没有什么可以说这是将位编码为十进制数字的唯一方法。

  • 0:000
  • 1:001
  • 2:010
  • 3:011
  • 4:100
  • 5:101
  • 6:110
  • 7:111
  • 8:000 <-包装(或未使用)
  • 9:001 <-包装(或未使用)

要么

问题2:代表十进制数字需要多少位?

A2:您至少需要4位才能代表所有十进制数字。有一些浪费或包裹。

同样,最常见的方案是带包装的直接二进制,但是您可以使用任何其他方案。

  • 0:0000
  • 1:0001
  • 2:0010
  • 3:0011
  • 4:0100
  • 5:0101
  • 6:0110
  • 7:0111
  • 8:1000
  • 9:1001
  • 0:1010 <-包装(或未使用)
  • 1:1011 <-包装(或未使用)
  • 2:1100 <-包装(或未使用)
  • 3:1101 <-包装(或未使用)
  • 4:1110 <-包装(或未使用)
  • 5:1111 <-包装(或未使用)

2

在基数1024中,每个符号为10位。三个十进制数字具有与基数1000中的一位数字相同的信息量,该数字略小于1024。因此,十进制数字具有略小于10/3的位。该近似值为3.333333 ...,而实际数字为3.321928 ...


2
  • 十六进制(基数16)-4位
  • 八进制(以8为底)-3位
  • 二进制(以2为底)-1位
  • 十进制(以10为底)-3 1/3位。
    2 10 = 1,024
    10 3 = 1,000
    2 20 = 1,048,576
    10 6 = 1,000,000
    以10为基数的10位中最多可以容纳3个数字,以2为基数。以10为基数的10位中
    可以最多容纳999,999的基数。 2.
    这就是千字节,兆字节和千兆字节的起源。

它实际上小于3 1/3 ...您的答案有点模棱两可,关于可以存储最多999个数字而不是0-1023之间的数字的建议有点误导。
wizzwizz4

0

免责声明-我不是信息理论家,只是主要在C和C ++(因此使用固定宽度类型)中工作的代码猴子,而我的回答将是从特定角度出发。

这需要平均 3.2个位来表示一个单一的十进制数字- 0到7可以在3个比特来表示,而图8和9需要4 (8*3 + 2*4)/10 == 3.21

这没有听起来那么有用。一方面,您显然一点都没有。另外,如果您使用的是本机整数类型(即,不是BCD或BigInt),则不会将值存储为十进制数字序列(或它们的等效二进制数)。8位类型可以存储某些值,这些值最多可以包含3个十进制数字,但是您不能以8位表示所有3个十进制数字的值-范围为[0..255]。您不能[256..999]仅用8位表示值。

在讨论值时,如果应用程序期望使用十进制数(例如,数字银行应用程序),则将使用十进制数。在谈论bit时,通常会使用十六进制或二进制(我几乎从不使用八进制,因为我在使用8位字节和32位字(不能被3整除)的系统上工作)。

用十进制表示的值不能完全映射到二进制序列上。取十进制值255。每个数字的二进制等同物将是010101101。但是,该值的二进制表示形式25511111111。值中的任何十进制数字与二进制序列之间根本没有对应关系。但是与十六进制数字-有直接对应关系F == 1111,因此可以将值表示为FF十六进制。

如果您使用9位字节和36位字为标准的系统,则八进制更有意义,因为位自然会分成三位。


  1. 实际上,由于0和1仅需要一位,而2和3仅需要2位,因此每位数的平均值较小。但是,实际上,我们认为0到7占用3位。可以使生活更轻松。


4
这不是那么简单。例如,3或4位编码不足以判断1001001应为 91还是49

@Hurkyl:同样,我的观点是使用固定宽度的整数类型- 1001001映射到7364 + 8 + 1)。我不将其解释为二进制编码的十进制数字序列。如果假设它是BCD,每位必须使用4位,那么我们必须假设一个前导0位,因此必须为49
约翰·博德

2
我只是想指出可变长度编码并不像您想象的那么简单。您需要知道一个符号在哪里结束而另一个符号在哪里开始。因此,您不能只说可以用4位表示8和9,用3表示4-7,用2表示2-3,用1表示0-1。您会看到,3.2您得到的数字实际上违反了信息理论的界限log(10)/log(2)

@Hurkyl:我并不是想使任何事情变得简单,也不是在谈论任何编码。可以用32位整数表示的最大值是10个十进制数字宽(每位3.2位),但是任何数字的二进制编码和该值的二进制编码之间没有对应关系。如果您对十进制数字使用某种形式的二进制编码,那么宽度必须固定为la BCD,或者必须使用某种我不主张的霍夫曼编码。
约翰·博德

1
该方案的问题是您忘记了需要指示3位还是4位的额外一位。而且平均长度为每十进制数字4.2位,这甚至比BCD更糟
MSalters

0

如果我要教这个,我首先要解释一个数字(用一系列数字表示)。即,从右到左,假设底数为n,则a * n ^ 0 + b * n ^ 1 + c * n ^ 2 ... z * n ^ y。

然后解释10 ^ 3大约等于2 ^ 10。这不是精确的,也是计算机的原因,我们通常不知道2k的真正含义(是2,000还是2,048?),它可以很好地用于快速近似。2 ^ 16约为2 ^(16-10)* 1,000,或2 ^ 6(64)* 1,000或64,000。实际上,它是65,536,但是如果您不介意超出某个百分比,那么它对于快速逼近非常有效。


尽管这是一项明智的见识,并且对OP的课程设置做出了宝贵的贡献,但它并不是问题的答案。
斯科特,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.