二進制中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);
}