思路:
牵扯到二进制数,基本上要考虑位运算符 ,相关知识可以见http://t.csdnimg.cn/fzts7
之前做过类似的题目,大致思路就是先用按位异或^找出不同位 ,再用n&(n-1)计算出不同位的个数 ,但是这道题有个小坑,就是极限了话,n刚好为int类型的最小值(即二进制数为1000......0000),此时n-1就会溢出。
就是A和B的二进制数刚好是1000......0000和0000......0000,此时n=A^B就是1000......0000,所以此时n再减1就溢出了,因此我们要考虑这个特殊情况
INT_MIN 代表int类型的最小值,即-2147483648
INT_MAX 代表int类型的最大值,即2147483647
定义INT_MIN 只能 INT_MIN = ( - INT_MAX) - 1
而不能 INT_MIN = - ( INT_MAX + 1) 因为这样就溢出最大值了
其头文件为#include<limits.h>
int convertInteger(int A, int B)
{
int count=0;
int n=A^B;
while(n)
{
if(n==INT_MIN) //如果是最小值
{
count++;
break;
}
n=n&(n-1); //减去一个1的个数
count++;
}
return count;
}