<p>(正)整数的二进制表示可以看作是加权和。你知道吗</p>
<p>考虑<code>1011</code>=11。你知道吗</p>
<pre>
1011
abcd
In other words: a = c = d = 1
and: b = 0
</pre>
<p>可以表示为加权和:</p>
<p>8*a+4*b+2*c+1*d</p>
<p>按定义插入a,b,c,d,你会得到11,但另一种看加权和的方法是:</p>
<pre><code>(2**3)*a + (2**2)*b + (2**1)*c + (2**0)*d
</code></pre>
<p>或者</p>
<pre><code> (2**3)*a + (2**2)*b + (2**1)*c + (2**0)*d
└ exponent └ exponent └ exponent └ exponent
</code></pre>
<p>这里,2的指数是递减的,乘以二进制数。你知道吗</p>
<p>换句话说:</p>
<p><code>(2**3)*1 + (2**2)*0 + (2**1)*1 + (2**0)*1 == 11</code></p>
<p>首先反转字符串,然后指数从零开始向上计数可能更容易:</p>
<p><code>(2**0)*1 + (2**1)*1 + (2**2)*0 + (2**3)*1 == 11</code></p>
<p>在不透露太多信息的情况下,假设变量<code>binstr</code>中包含二进制字符串,我将查看以下输出:</p>
<pre><code>print(list(enumerate(reversed(binstr))))
</code></pre>
<p>或者</p>
<pre><code>for (i, x) in enumerate(reversed(binstr)):
print(i, x)
</code></pre>
<p>有一种方法可能最终看起来像:</p>
<pre><code>intval = sum(<something> for (i,x) in enumerate(reversed(binstr)))
</code></pre>
<p>但这不是唯一的办法。还有其他方法,包括使用<code>reduce</code>(或类似的方法)。你知道吗</p>
<p>当然,总有<code>int(binstr, 2)</code>但我猜这也是不允许的。你知道吗</p>