1. 程式人生 > >求int型數據在內存中存儲時1的個數

求int型數據在內存中存儲時1的個數

std 整數和 outline 1的個數 操作 輸入 utl lis gin

1.求int型數據在內存中存儲時1的個數
輸入一個int型數據,計算出該int型數據在內存中存儲時1的個數。

我們非常easy想到例如以下方法:

#include <iostream>
using namespace std;
int main()
{
	int n,cnt=0;
	cin>>n;
	while(n)
	{
		if(n%2==1)
			cnt++;
		n=n/2;
	}
	cout<<cnt<<endl;

	return 0;
}


在對代碼進行測試時輸入負數無法得出結論。以下的方法將解決這一問題。

#include <iostream>
using namespace std;
int GetCount(int n)
{
	int m=0;
	while(n)
	{
		n&=(n-1);
		m++;
	}
	return m;
}
int main()
{
	int a;
	cin>>a;
    cout<<GetCount(a)<<endl;
}

技術分享

假設我們把這個整數減去1,那麽原來處在整數最右邊的1就會變成0。原來在1後面的全部 的0都會變成1。其余的全部位將不受到影響。

舉個樣例:一個二進制數1100,從右邊數起的第三位是處於最右邊的一個1。減去1後。第三位變成0,它後面 的兩位0變成1,而前面的1保持不變,因此得到結果是1011。


我們發現減1的結果是把從最右邊一個1開始的全部位都取反了。這個時候假設我們再把原來的整數和減去1之後的結果做與運算。從原來整數最右邊一個1那一位 開始全部位都會變成0。如1100&1011=1000。

也就是說,把一個整數減去1。再和原整數做與運算,會把該整數最右邊一個1變成0。那麽 一個整數的二進制有多少個1。就能夠進行多少次這種操作。


比如上面中-10,在32位機中表示為1111111111111111 1111111111110110,所以1的個數為30.








求int型數據在內存中存儲時1的個數