【问题标题】:Bits needed to change one number to another将一个数字更改为另一个数字所需的位
【发布时间】:2011-01-20 11:46:36
【问题描述】:

假设我有两个正数 a 和 b。为了将 a 转换为 b 必须反转多少位? 我只想要计数而不是不同位的确切位置。

假设 a = 10 ( 1010 ) 和 b = 8 ( 1000 )。在这种情况下,应该反转的位数等于 1。

任何通用算法?

【问题讨论】:

  • 你可能已经知道了,但为了记录,这个东西叫做汉明距离。

标签: c# c++ c algorithm


【解决方案1】:

解决办法很简单

完成!

【讨论】:

  • 我同意这是 a 正确答案,但是 OP 要求使用通用算法。 “计算结果中设置的位数”将是一条过于高级的指令,无法作为算法中的一个步骤。我不确定这个答案是否比其他答案好 20 个。
  • 这是一个完美的答案。一些 CPU 甚至将人口计数作为一条指令,至少过去如此,因为它在密码学中有应用。
  • 您的第二个也是最重要的步骤有一个断开的链接。这个答案是不完整的,是你为什么应该带代码的完美例子。
【解决方案2】:
int a = 10;
int b = 8;

int c = a ^ b; //xor
int count = 0;
while (c != 0)
{
  if ((c & 1) != 0)
    count++;
  c = c >> 1;
}
return count;

【讨论】:

  • 请注意,通常有更快的方法来获取数字的总体计数。我在“美丽的代码”中读到了一篇不错的文章
【解决方案3】:
changeMask = a XOR b
bitsToChange = 0
while changeMask>0
  bitsToChange = bitsToChange + (changeMask AND 1)
  changeMask = changeMask >> 1
loop
return bitsToChange

【讨论】:

    【解决方案4】:

    很好的老式位操作!

    size_t countbits( unsigned int n )
    {
       size_t bits = 0;
       while( n )
       {
          bits += n&1;
          n >>= 1;
       }
       return bits;
    }
    
    countbits( a ^ b );
    

    这可以在 C 和 C++ 中工作。您可以(仅在 C++ 中)将 countbits 函数设为模板。

    【讨论】:

      【解决方案5】:

      实际上,谦虚地建立在先前答案的基础上 - 这可能更适合将 a 转换为 b:

      与先前答案的唯一区别是 b 中已经设置的位不需要再次设置 - 所以不要计算它们。

      计算 (a XOR b) AND ~b

      计算设置的位数

      根据评论更正了帖子。谢谢!

      【讨论】:

      • 我不确定你用设置位暗示什么,但你的答案肯定是错误的。 OP想要计算两个位串之间的汉明距离,而之前的答案正确地做到了这一点。您的 AND !b 会产生不同的结果(除了您可能指的是 ~b 而不是 !b 来反转位的集合)。
      【解决方案6】:

      abs(popcount(a) - popcount(b)) 其中 popcount 对设置的位数进行计数(存在许多不同的变体)

      【讨论】:

      • 这是错误的。如果输入是(二进制)0101 和 1010,它将返回 0,但正确答案是 4。
      • 是的,我误解了这个问题:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-19
      • 2018-02-24
      • 1970-01-01
      • 1970-01-01
      • 2019-06-20
      相关资源
      最近更新 更多