解题思路:
(1)首先使用异或,如c = a^b,求出的数c中1的个数就是不同的个数
(2)因为左移会改变符号,因此这里考虑右移
(3)因为二进制无论是原码还是补码,当最后一位是0时,该整数必能整除2
(4)非负数,每次右移一位,补0,不改变1的个数,只有当被移位是1时才会改变
(5)负数(补码)每次右移一位,补1,增加1的个数,可以反其道而行之,我们计算出0的个数,再使用32减去该值
class Solution {
public:
/**
* @param a: An integer
* @param b: An integer
* @return: An integer
*/
int bitSwapRequired(int a, int b) {
int c = a^b;//不同的位置为1,接下来统计1的个数
return NumberOf1(c);
}
int NumberOf1(int &n) {
int count = 0;
if (n>=0) {
while(n!=0) {
if (n%2!=0) count++;
n = n >> 1;
}
return count;
} else {
while(n!=-1) {
if (n%2==0) count++;
n = n >> 1;
}
return 32-count;
}
return count;
}
};