2个二进制数之间共同的位数

时间:2015-02-01 02:47:07

标签: c recursion binary

我正在编写一个程序来计算给定数字的两个二进制表示之间的共同位数。我写的代码是:

int common_bits(int a, int b) {


static long binaryNo1,binaryNo2,remainder1,remainder2,factor = 1;

if(a!= 0&&b!=0){

     remainder1 = a % 2;
     binaryNo1 = remainder1 * factor;
     remainder2 = b % 2;
     binaryNo2 = remainder2 * factor;
     factor = factor * 10;
     if (binaryNo2==binaryNo1)
     {
         int count=0;
         count++;

     }
    common_bits(a/2,b/2);
}

        return 0;



}

我一直面临着错误,任何人都可以解释原因并告诉我如何纠正它。

这是如何工作的一个例子:13(二进制1101)和7(二进制111)共有2位

提前感谢。

2 个答案:

答案 0 :(得分:1)

您不需要构建处理二进制数字字符串的数值,就好像它们是十进制数字一样,这就是您所遇到的所有问题。嗯,它实际上并不是这个想法导致你的问题,但你用来试图实现这个想法的代码风格很差。 static变量很糟糕,尤其是递归时。没有返回值也很糟糕。

这就够了:

int common_bits(int a, int b)
{
    if (a == 0) return 0;
    if (b == 0) return 0;
    return ((a&1) == (b&1)) + common_bits(a/2, b/2);
}

它起作用是因为a&1得到a的最低位,而==在两个操作数相等时求值为1,否则为零。

或者您可以使用XNOR,有时也称为按位EQV:

return ((a^~b)&1) + common_bits(a/2, b/2);

答案 1 :(得分:1)

首先,让我们修复你的程序:你的代码在递归调用后没有返回任何内容,乘以一个不必要的因子,使用因子10 k 而不是2 k ,并使用不必要的递归。修复相当简单:

remainder1 = a % 2;
remainder2 = b % 2;
int count = 0;
if (remainder1 == remainder2) {
    count++;
}
return count + common_bits(a/2, b/2);