将一个数字更改为另一个数字所需的位

Posted

技术标签:

【中文标题】将一个数字更改为另一个数字所需的位【英文标题】: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。

任何通用算法?

【问题讨论】:

你可能已经知道了,但为了记录,这个东西叫做汉明距离。 【参考方案1】:

解决办法很简单

步骤 1 ) 计算 a XOR b 步骤2)Count the number of set bits in the result

完成!

【讨论】:

我同意这是 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。 是的,我误解了这个问题:)

以上是关于将一个数字更改为另一个数字所需的位的主要内容,如果未能解决你的问题,请参考以下文章

将 UIRefreshControl 所需的路径更改为 UIControlEventValueChanged

为啥我总是必须将精灵的位置更改为其他位置才能获得所需的位置

css 将Bootstrap Mobile菜单更改为所需的断点

如何将按钮的位置更改为窗口内所需的位置?

创建具有特定位数设置的多个数字

将 Excel 中的值从字符串更改为数字