算法實踐:二進制中1的個數(lowbit)

二進制中1的個數(lowbit料理)

描述

請用lowbit解決如下問題:

輸入一個32位整數,輸出該數二進制表示中1的個數。

注意:

  • 負數在計算機中用其絕對值的補碼來表示。

輸入

輸入:9
輸出:2
解釋:9的二進制表示是1001,一共有2個1。

輸出

輸入:-2
輸出:31
解釋:-2在計算機裏會被表示成11111111111111111111111111111110,
      一共有31個1。

樣例

-2
31

難度

中,lowbit的用法

解法

lowbit(n)函數取出n在二進制表示下最低位的1以及它後面的0構成的數值

lowbit(x)=n&(~n+1)

原理:
假設x最低位的1在第k位上
則 ~ n的二進制的第k位爲0, 0~k-1位全部爲1,k+1 ~ inf位也被取反
於是~ n + 1 由於進位,0~k-1位全部爲0,第k位爲1,k+1 ~ inf位仍然和原來相反

於是n&(~ n + 1)自然就只剩下最低位的1以及它後面的0構成的數值了

由於補碼下:~ n=-1-n

於是

lowbit(x)=x&(-x)

代碼

#include<iostream>
using namespace std;
int lowbit(int n){
    return n & -n; //!-n表示n取反+1
}
int NumberOf1(int n){
    int res = 0;
    while(n){
        n -=lowbit(n);
        res +=1;
    }
    return res;
}
int main()
{
    int n ; cin>>n;
    cout<<NumberOf1(n);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章