了解数学

时间:2018-09-21 05:43:18

标签: python-3.x

我试图理解这段将二进制转换为十进制的代码中的数学。我想知道是否有人可以分解它,以便我可以看到转换的工作。抱歉,如果这太新了,但是我一直在寻找一种解释,已经有好几个小时了,却找不到足够的解释。

我知道转换是十进制* 2 + int(数字),但是我仍然无法分解以了解如何将其转换为十进制

binary = input('enter a number: ')
decimal = 0
for digit in binary:
    decimal= decimal*2 + int(digit)

print(decimal)

4 个答案:

答案 0 :(得分:3)

这里的示例使用小二进制数字10(十进制数字2)

binary = 10

for digit in binary:
    decimal= decimal*2 + int(digit)

for循环将从第一位的二进制数中取出1。 digit = 1进行第一次迭代。 它将覆盖最初为0的十进制值。

decimal = 0*2 + 1 = 1

对于第二次迭代digit= 0。 它将再次计算十进制值,如下所示:

decimal = 1*2 + 0 = 2

所以您的十进制数字是2​​。

您可以参考binary to decimal conversion

答案 1 :(得分:3)

for循环和语法隐藏了更大的模式。首先,考虑我们在日常生活中使用的相同的以10为底的数字。表示数字237的一种方法是200 + 30 + 7。进一步细分,我们得到2*10^2 + 3*10^1 + 7*10^0(请注意,**是Python中的指数运算符,但是^几乎在世界其他任何地方都被使用)。

相对于基数,存在指数系数的这种模式。在我们的示例中,指数分别为2、1、0 ,我们可以用负指数表示分数。系数2、3和7与我们开始的数字237相同。

最终,您可以针对任何基础独特地执行此操作。也就是说,每个实数在以10为底的基数,以2为底的基数以及您要使用的任何其他基数中都有唯一的表示形式。在以2为底的基数中,出现了完全相同的模式,但是所有的10都被2代替。例如,以二进制形式考虑101。这与1*2^2 + 0*2^1 + 1*2^0相同,或者以10为底的仅5。

您拥有的算法可以使效率提高一点。当您在每种情况下基本上都执行相同的操作时,计算2 ^ 20、2 ^ 19、2 ^ 18等都是非常浪费的。在我们同样的二进制示例101中,他们将其重写为( 1 * 2 + 0 )* 2+ 1 。请注意,如果将第二个2分配到括号中,则会得到与开始时相同的表示形式。

如果我们有一个更大的二进制数,例如11001,该怎么办?好吧,同样的技巧仍然有效。 ((((( 1 * 2 + 1 )* 2 + 0 )* 2+ 0 )* 2+ 1

在最后一个示例中,您的算法在做什么?它是第一个计算( 1 * 2 + 1 )。在下一个循环中,它将该数字乘以2,然后加上下一个数字即可得到(( 1 * 2 + 1 )* 2 + 0 ),等等。再经过两次迭代,您的整个十进制数就已经计算出来了。

答案 2 :(得分:1)

有效地,这是将每个二进制数字乘以2 ^ n(其中n是该数字的位置),然后将它们求和。造成这种混乱的原因是,这几乎是相反的,让我们来看一个示例:

binary =“ 11100”

  • 因此,首先获取数字“ 1”并将其添加到0 * 2 = 0,所以我们 位数='1'。
  • 接下来将第二个数字“ 1”添加到1 * 2 = 2,数字=“ 1” +“ 1” * 2。
  • 再次相同,位数='1'+'1'* 2 + '1'* 2 ^ 2。
  • 然后2个零不加任何内容,但将结果加倍两次, 所以最后,digit ='0'+'0'* 2 +'1'* 2 ^ 2 +'1'* 2 ^ 3 +'1'* 2 ^ 4 = 28

(我在数字两边加上引号以显示它们的位置)

如您所见,这种格式的最终​​结果是一个非常简单的二进制到十进制的转换。

希望这对您有所帮助:)

答案 3 :(得分:1)

我将尝试解释逻辑:

考虑二进制数11001010。在Python中循环时,第一个数字1排在第一位,依此类推。

要将其转换为十进制,我们将其乘以2 ^ 7,直到0乘以2 ^ 0。 然后我们将它们相加(求和)。

在这里,我们每当取一个数字时就相加,然后乘以2直到循环结束。例如,此处执行1 *(2 ^ 7)作为十进制= 0(十进制)+1,然后乘以2,7次。当第二个迭代中的下一个数字(1)出现时,将其添加为十进制= 1(十进制)* 2 +1(数字)。在循环的第三次迭代中,十进制= 3(十进制)* 2 + 0(数字)

3 * 2 =(2 + 1)* 2 =(第一位数字)1 * 2 * 2 +(第二位数字)1 * 2。

所有数字继续如此。