1、直接n%2 == 1 就是乙個1
int numberof1(unsigned int n)
}return nnum;
}
優化:把n = n / 2; 修改為n>>1,移位運算能大量提高效率
2、在前面的運算中,我們如果要求0-n中1的個數的話,又該怎麼做呢?顯然一次次呼叫numberof1是不科學的,這勢必會浪費很多次計算,我們引入乙個知識點n&(n-1)其中n >=1
(1)、首先我們看一下n-1 和n的區別是什麼?
假設:n為 ***x101010
n-1為***x101001
那麼n&(n-1)= ***x101000 就能把最右邊的1給去掉,那麼n中的1個數= n&(n-1) +1 去掉最右邊的1再+1
那麼這樣的話,從0開始到n求得的n中的個數。可以不斷應用計算過的數然後+0、+1操作
int numberof1s(unsigned int num)
return res;
}
3、回到第乙個問題,當n不斷變大的時候(幾千上e的時候),計算的過程就相當的慢了,我們發現乙個unsied int 是由4個8位資料組成的(通用機器)
因此我們可以建表0~256,然後直接去4個裡面的1計算
int numberof1s(unsigned int num)
return res;
}int nnumber[257] = numberof1s[256];
int numberof1(unsigned int n)
整數二進位制中1的個數
輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。如果是0,返回0 如果是正整數,除二取餘法 如果是負數 3.1 如果是 2147483648 int表示最大絕對值的負數 其補碼是1000 0000 0000 0000 0000 0000 0000 0000,故返回 1 3.2 其他...
整數二進位制中1的個數
要統計乙個整數二進位制中1的個數,首先我們會想到最簡單的方法就是 2 再 2,然後判斷每一位是否為1。但是,如果這是乙個很大的數,頻繁的除法運算效率不是很高。而位運算比乘除法效率高,所以我們就來用位運算解決這道題。首先方法一,當num大於0時,判斷num 1 的值,即可知道最後一位的值,迴圈每次nu...
求二進位制中1的個數
在 程式設計之美 一書中有一節提到如何求乙個位元組的無符號整型變數二進位制表示中中1的個數,主要提到了四種方法。下面簡單介紹一下 1.求餘法 在將十進位制數轉換為二進位制數時,採用除2取餘法。將每次除2得到的餘數儲存起來逆序輸出便是該十進位制整數的二進位制表示。因此可以採用這種方法去統計1的個數。i...