说我有两个正数a和b。为了将a转换为b,必须反转多少位? 我只想要计数而不是不同位的确切位置。
假设a = 10(1010)且b = 8(1000)。在这种情况下,应该反转的位数等于1.
任何通用算法?
答案 0 :(得分:25)
答案 1 :(得分:7)
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;
答案 2 :(得分:2)
changeMask = a XOR b
bitsToChange = 0
while changeMask>0
bitsToChange = bitsToChange + (changeMask AND 1)
changeMask = changeMask >> 1
loop
return bitsToChange
答案 3 :(得分:1)
良好的老式位操作!
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功能成为一个模板。
答案 4 :(得分:-1)
实际上,谦虚地建立在之前的答案上 - 这可能更适合将a转换为b:
与之前答案的唯一区别是,b中已经设置的位不需要再次设置 - 所以不要计算它们。
计算(XOR b)AND~b
计算设定位
根据评论更正帖子。谢谢!
答案 5 :(得分:-2)
abs(popcount(a) - popcount(b))其中popcount计算数字中设置的位数(存在许多不同的变体)