为什么这种电源功能有效?

时间:2016-08-22 09:49:39

标签: c loops

res = 1;
for ( i = 1; i <= n; i <<= 1 ) // n = exponent
{
    if ( n & i )
        res *= a; // a = base
    a *= a;
}

这应该是更有效的电源代码,我不知道为什么会有效。

for()的第一行很好我知道为什么有i&lt;&lt; = i。但我不明白以下的界限:if(n&amp; i)。我知道这是如何运作的,但我不知道为什么......

1 个答案:

答案 0 :(得分:0)

我们假设你有一个无符号数的二进制表示。你如何找到十进制表示?

让我们举一个简单的四位示例:

N = |   0     |    1    |    0    |    1    |
    -----------------------------------------
    | 2^3 = 8 | 2^2 = 4 | 2^1 = 2 | 2^0 = 1 |
    -----------------------------------------
    |    0    |     4   |    0    |     1   |  N = 4 + 1 = 5

现在如果每个位的基数没有固定为2,而是前一位的平方而你将每个位的贡献乘以而不是添加:

N = |   0   |  1  |  0  |  1   |
    ----------------------------
    |   a^8 | a^4 | a^2 |  a^1 |
    ----------------------------
    |   0   | a^4 |  0  |  a^1 |  N = a^4 * a^1 = a^(4+1) = a^5

如您所见,代码计算了^ N