【发布时间】:2011-01-20 11:46:36
【问题描述】:
假设我有两个正数 a 和 b。为了将 a 转换为 b 必须反转多少位? 我只想要计数而不是不同位的确切位置。
假设 a = 10 ( 1010 ) 和 b = 8 ( 1000 )。在这种情况下,应该反转的位数等于 1。
任何通用算法?
【问题讨论】:
-
你可能已经知道了,但为了记录,这个东西叫做汉明距离。
假设我有两个正数 a 和 b。为了将 a 转换为 b 必须反转多少位? 我只想要计数而不是不同位的确切位置。
假设 a = 10 ( 1010 ) 和 b = 8 ( 1000 )。在这种情况下,应该反转的位数等于 1。
任何通用算法?
【问题讨论】:
【讨论】:
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;
【讨论】:
changeMask = a XOR b
bitsToChange = 0
while changeMask>0
bitsToChange = bitsToChange + (changeMask AND 1)
changeMask = changeMask >> 1
loop
return bitsToChange
【讨论】:
很好的老式位操作!
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 函数设为模板。
【讨论】:
实际上,谦虚地建立在先前答案的基础上 - 这可能更适合将 a 转换为 b:
与先前答案的唯一区别是 b 中已经设置的位不需要再次设置 - 所以不要计算它们。
计算 (a XOR b) AND ~b
计算设置的位数
根据评论更正了帖子。谢谢!
【讨论】:
AND !b 会产生不同的结果(除了您可能指的是 ~b 而不是 !b 来反转位的集合)。
abs(popcount(a) - popcount(b)) 其中 popcount 对设置的位数进行计数(存在许多不同的变体)
【讨论】: