c++ - 需要澄清这个执行乘法的循环

标签 c++ algorithm loops math multiplication

int x, y; // x is a non-negative integer 
p = 0;
while (x > 0)
{
    if ( x % 2 == 1 )
       p = p + y;
    y = y*2;
    x = x/2;
}
// p == a*b here

我知道这个循环使用代数找到“a”和“b”的乘积:

a * b = (1/2)a * 2b

但是我看不懂代码:

if ( x % 2 == 1 )
    p = p + y;

我希望有人能解释为什么“p”在 x 的奇数值上被分配为“p + y”。

最佳答案

while (x > 0) {
    if (x % 2 == 1)
        p = p + y;
    y = y*2;
    x = x/2;
}

假设 x = 4,y = 5

迭代:

  1. x 是偶数,y = 10,x = 2(即 x 可以分开,y应该加倍)
  2. x 是偶数,y = 20, x = 1
  3. x 是奇数,p = 20,y = 40,x = 0(即 x不能再分了,y应该加到p)
  4. x > 0false,循环结束

p = 4 * y

现在假设 x 一开始是奇数,假设 x = 5,y = 2:

  1. x 是奇数,p = 2,y = 4,x = 2
    (5/2 = 2.5,x 的新值将向下舍入,y 应在加倍之前添加/强>)
  2. x 是偶数,y = 8, x = 1
  3. x 是奇数,p = 10,y = 16,x = 0

p = y + 4*y

第一个 y 是原因,在它加倍之前将它添加到结果 (1 * y) 在这种情况下相当于 0.5 * ( 2 * y)

关于c++ - 需要澄清这个执行乘法的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19079272/

相关文章:

寻找最佳组合的算法

javascript - 如何在此 lodash 循环中动态命名我的对象参数?

c++ - Qt Creator + OpenCV : Program runs from . exe 但不是来自编辑器

c++ - 静态成员初始化期间访问私有(private)静态函数

c++ - 为什么这个初始化 C 数组的构造函数初始化列表会编译?

arrays - 我的矩形在 2d 正方形网格中接触了多少个正方形?

string - 使用动态规划对字符串进行分割

python - del 语句不适用于列表

c++ - 代码输出随机符号,我不确定出了什么问题

c++ - c++中的bool数组问题