LintCode 365. Count 1 in Binary

原題

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容