将十进制数转换为二进制数

时间:2009-10-19 21:23:20

标签: algorithm binary decimal

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

                [ ]   [ ]   [ ]   [ ]   [ ]   [ ]   [ ]   [ ]
                ÷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 < / strong>并将其用作下一次计算的红利,这当然会让我陷入各种各样的问题,最终不是二进制数10010110!

有人可以告诉我哪里出错了吗?

5 个答案:

答案 0 :(得分:7)

22是150/128的剩余部分。

既然你已经确定在150中有1 128“,并给出了该位的值,那么你可以忘掉那个”在“150中的128,所以你把它从150中拿走,留下我们的22.然后这个数字值64:64的时间不会进入22,所以这个数字是0.而且数字值也是32。那么数字值16:16进入22次,所以那里有1位数,现在你已经完成了16“in”22,所以把它带走 - 留下6.等等。

(考虑一个类似的基础10的情况,假设309.取100s列; 309中有3 100个,所以你在那里放3个。现在剩下9个。然后取10个列;有0个9s中10s,所以你把0放在那里。然后是1s栏:9中有9个1,所以你在那里放了9个。现在没有什么了 - 你已经完成了。)

我有一种可怕的感觉,这可能比澄清更令人困惑,但无论如何,这就是我的想法。

答案 1 :(得分:5)

22是剩余部分 150/128 = 1余数22

答案 2 :(得分:4)

你需要进行integer分裂。

// Floating point
150 ÷ 128 = 1.171875

// Integer
150 ÷ 128 = 1 remainder 22

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

答案 3 :(得分:2)

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

答案 4 :(得分:0)

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

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