我在搜索问题的解决方案时在互联网上找到了这个功能。我测试了它,似乎工作正常。我只需要知道它是如何工作的。这比找到GCD的常用方法更有效吗? 这是功能:
int gcd(int a,int b){
while(b)
b^=a^=b^=a%=b;
return a;
}
答案 0 :(得分:0)
此代码仅实现Euclid's algorithm以找到最大公分母(GCD)。我认为这是相当标准的,因为它自公元前300年左右就广为人知。当你说“找到GCD的常用方法”时,我不确定你正在比较它的其他算法,但是欧几里得的算法是有效的算法。
这段代码唯一奇怪的是它已被严重混淆。有人认为他们通过将所有代码压缩到一行是聪明的,但除非你根据你删除的代码行获得奖金,否则没有必要这样做。它不会更改编译器生成的目标代码;它只是让你的来源更难阅读和理解。
实际上,这里所做的混淆会在代码中引入严重的错误,假设这是C或C ++。 a
和b
上的操作为undefined because of a lack of sequence points。
此代码使用的另一种“聪明”技术是在不使用临时值的情况下交换值的按位异或。这是一个非常旧技巧,它已经很久了,以至于它在很多年里都不值得“优化”。实际上,它很可能比仅使用临时变量慢。有lots of descriptions of how it works online。它看起来很复杂但实际上很简单,所以很多人都在博客上写过它。
Ungolfed,您拥有的代码如下:
int gcd(int a,int b) {
while(b) // while b is non-zero
{
int temp = b; // cache current value of b
b = (a % b); // set b equal to (a modulo b)
a = temp; // set a equal to the original value of b
}
return a; // once b is zero, return a
}
请注意,代码也可以递归写入:
int gcd(int a,int b) {
if (b)
return gcd(b, a % b);
else
return a;
}