原題
LintCode 365. Count 1 in Binary
Description
Count how many 1
in binary representation of a 32-bit integer.
Example
Given 32
, return 1
Given 5
, return 2
Given 1023
, return 10
通常解法
不停地將這個數右移,當最后一位為1的時候計數+1,直到這個數變為0。
但是因為C++中沒有無符號右移,所以在面對負數的時候,上述算法就不管用了。
可以將負數取反,計算0的個數即可。
int countOnes(int num) {
bool negative = false;
if (num < 0) {
num = ~num;
negative = true;
}
int count = 0;
while (num) {
if (num & 1) count++;
num >>= 1;
}
if (negative) return 32 - count;
return count;
}
a & (a - 1)
網上查找更好解法的時候,發現了一個神奇的方法
int countOnes(int num) {
int count = 0;
while (num != 0) {
num = num & (num - 1);
count++;
}
return count;
}
那么這個a & (a - 1)
到底干了什么?
舉個例子 36
# 36
00100100
# 36-1
00100011
可以發現,每次減1
操作,都會從二進制數的最后一個1
處借位,使之變為0
,之后的所有位變為1
。
此時 將兩者按位與
# 36 & (36 - 1)
00100000
因為被借位以及之后的所有位都發生了改變,結果均為0
最終的結果是:將二進制數中的最后一個1
替換為0