这个循环做了什么?

时间:2010-12-11 06:51:54

标签: algorithm math puzzle

以下循环有什么作用?

k = 0
while(b!=0): 
   a = a^b 
   b = (a & b) << 1 
   k = k + 1 

其中abk整数。

最初a = 2 779 b = 2 62 然后终止后k的值是多少循环?

如果人们尝试手动而不是以编程方式解决问题,我会很高兴。

编辑:删除标签c和c ++。如何手动解决问题?

6 个答案:

答案 0 :(得分:4)

执行此块之后:

a = a^b ;
b = (a & b) << 1;

b将采用b中未设置且未在a中设置的任何位的整数表示。假设输入数字的形式为2 x a将变为a + b,而b本身将乘以2(由于转移)。这意味着当ab的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)

看起来循环正在执行一系列按位运算,同时在每次迭代时将k递增1。

关于按位运算符here.

,有一个看起来不错的教程

希望有所帮助。

答案 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”执行方式。