以下循环有什么作用?
k = 0
while(b!=0):
a = a^b
b = (a & b) << 1
k = k + 1
其中a
,b
和k
整数。
最初a
= 2 779 和b
= 2 62 然后终止后k
的值是多少循环?
如果人们尝试手动而不是以编程方式解决问题,我会很高兴。
编辑:删除标签c和c ++。如何手动解决问题?
答案 0 :(得分:4)
执行此块之后:
a = a^b ;
b = (a & b) << 1;
b
将采用b
中未设置且未在a
中设置的任何位的整数表示。假设输入数字的形式为2 x ,a
将变为a
+ b
,而b
本身将乘以2(由于转移)。这意味着当a
和b
的MSB相同时(在此示例中将是第780位),循环将终止。由于b
从第63位开始,最终将有718次迭代:780 - 63 + 1(最后一次迭代)= 718。
当您使用a
= 2 1 和b
= 2 0 执行此操作时,您可以看到这一点:
a = 10
b = 01
k = 0
a = 11
b = 10
k = 1
a = 01 (a + b no longer holds here, but it is irrelevant as this is the termination case)
b = 00
k = 2
答案 1 :(得分:2)
以下循环有什么作用?
它计算[a的力量] - [b的力量] + 1
如果你看一下比特模式就会变得非常清楚。对于a = 2 10 和b = 2 5 的初始值,它看起来像这样:
k = 0, a = 10000000000, b = 100000
k = 1, a = 10000100000, b = 1000000
k = 2, a = 10001100000, b = 10000000
k = 3, a = 10011100000, b = 100000000
k = 4, a = 10111100000, b = 1000000000
k = 5, a = 11111100000, b = 10000000000
Here是一个ideone.com演示。
对于你在帖子中提到的值,我得到k = 718。
答案 2 :(得分:0)
在一种支持这么大的数字的语言中,答案是718,这个问题无论如何都不是很有趣。
答案 3 :(得分:0)
答案 4 :(得分:0)
由于你已经提到过qnd b是一个整数,我认为值2 779 对于整数变量来说太大了以适应变量b 2 62 < / sup>以及。所以我认为两者都有最小值,所以在执行a = a ^ b之后; b =(a&amp; b)&lt;&lt; 1;这些语句a和be的值将为0.并且k的值将等于1.由于b为0,while循环的条件将为false并且它将退出循环。
编辑:答案适用于C / C ++或C#等编程语言
答案 5 :(得分:0)
这不是真正的C语法..如果我们认为代码是顺序的,我同意@Paul。但是,考虑到这一点
a + b == (a^b) + ((a&b) << 1)
其中a^b
是未从每个位应用进位的总和,并且每个位都携带(a&b)<<1
,我们可以说它执行求和, IFF C代码会是
int k = 0;
while(b){
int old_a = a;
a = a^b;
b = (old_a & b) << 1; // note that the need the original value of a here
k++; // number of recursion levels for carry
};
代码的不同可能是因为原始代码(或语言)中的“paralel”执行方式。