求int型數據在內存中存儲時1的個數
阿新 • • 發佈:2017-07-20
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的個數