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
迭代:
x
是偶数,y
= 10,x
= 2(即x
可以分开,y
应该加倍)x
是偶数,y
= 20,x
= 1x
是奇数,p
= 20,y
= 40,x
= 0(即x
不能再分了,y
应该加到p
)x > 0
为false
,循环结束
p
= 4 *y
现在假设 x
一开始是奇数,假设 x
= 5,y
= 2:
x
是奇数,p
= 2,y
= 4,x
= 2
(5/2 = 2.5,x
的新值将向下舍入,y
应在加倍之前添加/强>)x
是偶数,y
= 8,x
= 1x
是奇数,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/