【问题标题】:Binary to Decimal in Computers计算机中的二进制转十进制
【发布时间】:2012-05-08 23:30:21
【问题描述】:

计算机如何将二进制(例如 110011 (51))转换为相应的 ASCII 值 53('5') 和 49('1')?还有,电脑怎么把53和49转回110011?

【问题讨论】:

    标签: binary decimal computer-architecture


    【解决方案1】:

    二进制到十进制的转换通常作为一个重复的除法循环。如果我们从一个数字 N 开始,(N mod 10) 是最后一个数字,然后我们继续将 N 除以 10 并重复以获得其他数字。

    1. 我们从 N=51 开始
    2. 51 mod 10 是 1。最后一位是 1。
    3. 除以 10 以丢弃我们刚刚提取的数字(整数除法),得到 5。
    4. (这是第 2 步的重复,使用不同的 N)5 mod 10 是 5。下一个数字是 5。
    5. 5/10 为 0(四舍五入),所以我们完成了。倒序的数字是1和5。
    6. 我们将 48 添加到每个数字值中,以获取 ASCII 中相应的十进制数字。
    7. 所以最终结果是“51”。

    从字符串转换为内部表示更容易。

    1. 累加器中从 0 开始
    2. 取第一个字符(此处为“5”)。那是 ASCII 53。减去 48 得到 5。
    3. 将其添加到我们的累加器中得到 0+5=5。
    4. 注意还有一个数字。将累加器乘以 10 得到 50。
    5. 返回步骤 1

    在下一次迭代中(即“1”=ASCII 49)再次减去 48:49-48=1。我们在累加器上加 1,得到 51。没有更多字符,所以我们完成了,结果是 51。

    计算机的内部表示是二进制的这一事实是偶然的。我们只需要能够在计算机内部进行加减乘以将字符串转换为数字即可。

    (当然,减法只是一个负数的加法,而乘法只是一个加法序列,所以真正需要的只是加法。)

    【讨论】:

    • 谢谢,这就是我要找的。​​span>
    • 我认为您需要在答案的第一部分修复一些模数与除法。我知道你的意思,但你并没有真正遵循步骤中的逻辑,而是交替使用模和除法。
    【解决方案2】:

    尝试为此目的编写一个计算机程序。它通常在软件中完成,尽管一些处理器具有特殊用途的十进制指令。假设您的工作是查看带有二进制整数的纸条,并制作出带有 Unicode 代码点的纸条,您很快就会掌握基本的大纲。

    【讨论】:

    • 问题是,我不知道该怎么做。这就是我问的原因。
    • 首先你需要个位。那就是你的数字 mod 10 被索引到字符数组 0-9 中。然后你需要得到 10 的数字。然后是 100 的数字......只要想一想将一个数字分解成它的数字的代数。或者下载glibc的开源,阅读itoa的源码。
    【解决方案3】:

    这两种方式都不会改变它们。 53 在内存中始终是 53

    当它需要显示时,会调用一个函数,该函数知道当它看到数字53 时,它会生成我们眼睛看到的图形5。或者在内存中它可能会将数字53 转换为数字5351,最终某些程序将显示为字符"5""3"

    53 始终是110101。存储单元是一个位序列,将十进制的53 保存为位001101011

    同样,有些函数可以看到这些位,并可以在您的屏幕上生成字符 "5" 和字符 "3"

    但在计算机内部,它总是数字,总是二进制。

    【讨论】:

    • 那么,您是说计算机不使用 51 进行计算,而是使用几个不同的数字 53 和 49 来计算?
    • 嗯,没有。例如, fprintf / String.format 在内存中获取二进制整数并在内存中生成字符串。不涉及“图形”。
    • 但是它是如何使用二进制整数“在内存中产生字符串”的呢?
    • 很公平。但是,如果一个人曾经看过它,那么最终会有“图形”将像素放在屏幕上,我们将其视为“5”和“3”。
    • 当然,但我认为这不是 ursine OP 所要求的。在绘制字形之前很久,内存中肯定有“5”和“3”字符。
    【解决方案4】:

    将二进制转换为 ASCII:

    1) 将您的数字除以十进制数 10(二进制 1010)并计算余数 2) 余数加上 48('0' 的 ASCII 值)。这会给你最后一个数字。 3)如果商为0,停止 4) 如果商大于 0,则使用商从步骤 1 重新开始。

    例如。使用 base 10 (1010) 将 51 (110011) 转换为 ASCII:

    110011 / 1010  = 0101 (5 decimal) remainder 0001
    
    
    0001 (the remainder from above) + 110000 ('0') = 110001 (49 decimal or '1' in ASCII)
    
    0101 (the quotient from above) / 1010 = 0 remainder 0101
    0101 (the remainder) + 110000 ('0') = 110101 (53 decimal or '5' in ASCII)
    

    【讨论】:

      猜你喜欢
      • 2021-03-05
      • 2021-02-26
      • 2014-10-30
      • 2019-09-22
      • 2017-06-05
      • 2015-11-01
      • 1970-01-01
      • 2018-08-08
      • 2015-02-14
      相关资源
      最近更新 更多