我试图理解这段将二进制转换为十进制的代码中的数学。我想知道是否有人可以分解它,以便我可以看到转换的工作。抱歉,如果这太新了,但是我一直在寻找一种解释,已经有好几个小时了,却找不到足够的解释。
我知道转换是十进制* 2 + int(数字),但是我仍然无法分解以了解如何将其转换为十进制
binary = input('enter a number: ')
decimal = 0
for digit in binary:
decimal= decimal*2 + int(digit)
print(decimal)
答案 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。
答案 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”
(我在数字两边加上引号以显示它们的位置)
如您所见,这种格式的最终结果是一个非常简单的二进制到十进制的转换。
希望这对您有所帮助:)
答案 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。
所有数字继续如此。