【发布时间】: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.