[英]Converting a decimal number into binary
我目前正在阅读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并将其用作下一次计算的红利,当然让我陷入各种各样的问题,最终,不是二进制数10010110!
谁能告诉我哪里出错了?
22是150/128的剩余部分。
既然你已经确定有1 128“in”150,并给出了该位的值,那么你可以忘记那个“在”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个。然后取10s列; 9个中有0个10个,所以你把0放在那里。然后是1s栏:9中有9个1,所以你把9放在那里。现在没有什么了 - 你已经完成了。)
我有一种可怕的感觉,这可能比澄清更令人困惑,但无论如何,这就是我的想法。
剩下的就是22。
150/128 = 1余数22
你需要做integer
除法。
// Floating point
150 ÷ 128 = 1.171875
// Integer
150 ÷ 128 = 1 remainder 22
所以,你写下1
并将22
带到下一步。
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
该示例使用整数运算,并且150 - 128 => 22
。
这个例子是故意代数的,但大多数现代语言都定义了按位二元运算符。 (据推测,如果我们构建非二进制计算机,这些将被模拟。)因此实际上以这种方式进行二进制转换是非常罕见的。 更典型的是,您将使用<<
, >>
和&
来直接检测各个位。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.