以下使用按位运算查找两个数字的GCD的功能如何工作?

时间:2016-12-09 18:14:19

标签: greatest-common-divisor

我在搜索问题的解决方案时在互联网上找到了这个功能。我测试了它,似乎工作正常。我只需要知道它是如何工作的。这比找到GCD的常用方法更有效吗? 这是功能:

int gcd(int a,int b){
    while(b)
       b^=a^=b^=a%=b;
    return a;
}

1 个答案:

答案 0 :(得分:0)

此代码仅实现Euclid's algorithm以找到最大公分母(GCD)。我认为这是相当标准的,因为它自公元前300年左右就广为人知。当你说“找到GCD的常用方法”时,我不确定你正在比较它的其他算法,但是欧几里得的算法是有效的算法。

这段代码唯一奇怪的是它已被严重混淆。有人认为他们通过将所有代码压缩到一行是聪明的,但除非你根据你删除的代码行获得奖金,否则没有必要这样做。它不会更改编译器生成的目标代码;它只是让你的来源更难阅读和理解。

实际上,这里所做的混淆会在代码中引入严重的错误,假设这是C或C ++。 ab上的操作为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;
}
相关问题