【问题标题】:number of digits common between 2 binary numbers2个二进制数之间共有的位数
【发布时间】:2015-02-01 11:06:53
【问题描述】:

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

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 个共同的位

提前致谢。

【问题讨论】:

  • 你只计算两个数字都有1的地方吗?或者他们都有0?前导零呢?
  • 另外,关于你的代码的一切都比它需要的复杂。您可以将remainder1remainder2 进行比较。
  • 不,我忽略了前导零,并认为数字零具有 0 的单个位表示。
  • @BenVoigt 是的,你是对的,比较这些就足够了——我认为这不是问题的根源。谢谢我会做出改变

标签: c recursion binary


【解决方案1】:

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

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

【讨论】:

  • 除了使用余数运算符被破坏了,因为它在应该只有两种可能性的情况下给出了三个值(-1、0、1)。
  • 感谢负载!我真的很遗憾没有看透这个问题
  • @BenVoigt 你说得对,% 用于隐含假设数字是正数。
【解决方案2】:

您不需要构建将二进制数字字符串视为十进制数字的数值,这几乎是您所有问题的来源。好吧,实际上并不是这个想法导致了您的问题,但是你用来尝试实现这个想法的代码风格很差。 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 的最低位,而== 在两个操作数相等时计算为一,否则为零。

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

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

【讨论】:

  • 非常感谢!我真的很喜欢你减少代码的方式——这就是我想要开发的东西。
  • @L887:嗯,很明显你并不是要忽略递归调用的返回值。或者不使用就扔掉count
猜你喜欢
  • 1970-01-01
  • 2021-12-22
  • 2012-09-11
  • 2021-11-04
  • 2018-05-15
  • 1970-01-01
  • 1970-01-01
  • 2016-07-31
  • 1970-01-01
相关资源
最近更新 更多