思路:
牵扯到二进制数,基本上要考虑位运算符,相关知识可以见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;
}