【问题标题】:Converting a decimal number into binary将十进制数转换为二进制
【发布时间】:2010-12-08 03:42:17
【问题描述】:

我目前正在阅读 Charles Petzold 的《代码》一书。他在其中解释了如何使用以下模板将十进制数转换为二进制数:

                [ ]   [ ]   [ ]   [ ]   [ ]   [ ]   [ ]   [ ]
                ÷128  ÷64   ÷32   ÷16   ÷8    ÷4    ÷2    ÷1
                [ ]   [ ]   [ ]   [ ]   [ ]   [ ]   [ ]   [ ]

在书中,他对如何使用模板的解释如下:

"把整个十进制数(小于等于255)放在上面的方框里 左角。将该数字(被除数)除以第一个除数 (128),如 表明的。将商放在下面的方框中(左下角的方框),然后 右侧框中的剩余部分(顶行的第二个框)。第一个余数是下一次计算的被除数,它使用 64 的除数。通过模板以相同的方式继续。

请记住,每个商都是 0 或 1。如果被除数小于除数,则商为 0,余数就是被除数。如果被除数大于或等于除数,则商为 1,余数为除数 - 除数。以下是 150 的处理方式:"

                [150]  [22]   [22]   [22]   [6 ]   [6 ]   [2 ]   [0 ]
                ÷128   ÷64    ÷32    ÷16    ÷8     ÷4     ÷2     ÷1
                [1 ]   [0 ]   [0 ]   [1 ]   [0 ]   [1 ]   [1 ]   [0 ]

但我很困惑!当我按照指示进行计算时,我得到的结果非常不同。我正在做的事情如下:

150 ÷ 128 = 1.171875(我看不出上面的 22 是从哪里来的?)所以,我在 150 下方的方框中放了一个 1,然后携带 171875 并将其用作下一次计算的除数,这当然会让我陷入各种问题,最终不是二进制数 10010110!

谁能告诉我哪里出错了?

【问题讨论】:

  • 整数除法:a = qd + r : 0 <= r < d.

标签: algorithm binary decimal


【解决方案1】:

22 是余数。
150/128 = 1 余数 22

【讨论】:

    【解决方案2】:

    你需要做integer除法。

    // Floating point
    150 ÷ 128 = 1.171875
    
    // Integer
    150 ÷ 128 = 1 remainder 22
    

    所以,你记下1 并将22 带到下一步。

    【讨论】:

      【解决方案3】:

      该示例使用整数运算,以及150 - 128 => 22

      这个例子是故意代数的,但是大多数现代语言都定义了按位二元运算符。 (假设如果我们构建非二进制计算机,这些将被模拟。)所以实际上以这种方式进行二进制转换是非常罕见的。更常见的是,您会使用 <<>>& 直接检测各个位。

      【讨论】:

        【解决方案4】:

        128 一次进入 150,剩下 22 个。二进制数 10010110 转换为十进制;

        150 = (1 * 128) + (1 * 16) + (1 * 4) * (1 + 2) = 128+16+4+2
        

        用同样的方法我们可以分解十进制数 150;

        150 = (1 * 100) + (5 * 10) + (0 * 1) = 100 + 50
        

        【讨论】:

          【解决方案5】:

          22 是 150/128 的余数。

          既然你已经确定有 1128“在”150 中,并且给那个位一个值,你可以忘记在 150 中的 128,所以你把它从 150 中拿走,留下我们的 22。然后现在是值 64 的数字的时间:64 不会进入 22,因此该数字是 0。同样对于值 32 的数字。然后对于值 16 的数字:16 进入 22 一次,所以那里有一个数字,现在你已经完成了 16 “in” 22,所以把它拿走 - 留下 6。等等。

          (考虑一个类似的以 10 为底的情况,比如说 309。取 100s 列;309 中有 3 100s,所以你把 3 放在那里。现在剩下 9 个。然后取 10s 列;有 0 10 在 9 中,所以你把 0 放在那里。然后是 1s 列:9 中有 9 个 1,所以你把 9 放在那里。现在什么都没有了——你已经完成了。)

          我有一种可怕的感觉,这可能会造成混淆而不是澄清,但无论如何我就是这么想的。

          【讨论】:

            猜你喜欢
            • 2012-06-26
            • 2011-01-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-12-25
            • 2013-01-24
            • 2016-08-28
            相关资源
            最近更新 更多