将一个数字更改为另一个数字所需的位
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