需要将一个数字更改为另一个数字

时间:2011-01-20 11:46:37

标签: c# c++ c algorithm

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

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

任何通用算法?

6 个答案:

答案 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计算数字中设置的位数(存在许多不同的变体)