解題思路:
(1)因爲左移會改變符號,因此這裏考慮右移
(2)因爲二進制無論是原碼還是補碼,當最後一位是0時,該整數必能整除2
(3)非負數,每次右移一位,補0,不改變1的個數,只有當被移位是1時纔會改變
(4)負數(補碼)每次右移一位,補1,增加1的個數,可以反其道而行之,我們計算出0的個數,再使用32減去該值
class Solution {
public:
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;
}
};