c - 为什么这种幂函数起作用?

标签 c loops

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

这应该是更有效的权力代码,但我不知道为什么会这样。

for() 的第一行没问题,我知道为什么会有 i <<= i。但我不明白该行在哪里: if ( n & i )。我知道它是如何工作的,但我不知道为什么......

最佳答案

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

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

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

正如你所看到的,代码计算了a^N

关于c - 为什么这种幂函数起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39076316/

相关文章:

c - 变量名如何存储在 C 中的内存中?

c - 扫描: "%[^,]s"与 "%[^,],s"

c++ - 使用 cin 的良好输入验证循环 - C++

c - 在 C 中使用 while 循环每行少打印一个 "*"

c - 遍历文件中的行并与上一行进行比较

c - 尝试将 float 读入数组时 scanf 崩溃

c++ - 在文件末尾预处理多行注释及其嵌入的换行符

C编程子进程未执行

java - 如何解决 for 循环中的局部引用变量?

javascript - assertEquals 中的对象相等