判斷一個整數轉換成二進制後1的個數,大體有三種方法,分別是左移位、右移位和與運算。spa
第一種方法:右移位class
右移位的基本思路是,先將整數轉換成正整數,再將該數與1進行與運算。若不將整數作取絕對值處理,當輸入的數是負數時,每向右移動一位,高位會自動補1,就會致使死循環循環
- int ChargeOnesCountInNum1(int iNum)
- {
- int iCount=0;
- iNum = abs(iNum);
- while(iNum){
- if (iNum & 1){
- ++iCount;
- }
- iNum = iNum >> 1;
- }
-
- return iCount;
- }
第二種方法:左移位二進制
左移位的基本思路和右移位相同。方法
- int ChargeOnesCountInNum2(int iNum)
- {
- int iCount=0;
- unsigned int iFlag = 1;
- iNum = abs(iNum);
- </span> while(iFlag){
- if (iNum & iFlag){
- ++iCount;
- }
- iFlag = iFlag << 1;
- }
-
- return iCount;
- }
第三種方法:與運算word
將一個整數減去1以後,其對應的二進制中最右邊的一個1會變爲0,若其後存在0,則其以後的全部0都會變爲1。基於此,設一個整數爲n,則 n & (n-1)以後,會消掉n對應的二進制的最右邊的1。所以,將一個數中全部1消掉所用的次數,即爲該整數對應的二進制中1的個數。計算機
- int ChargeOnesCountInNum3(int iNum)
- {
- int iCount=0;
- iNum = abs(iNum);
- while(iNum){
- ++iCount;
- iNum = iNum & (iNum-1);
- }
-
- return iCount;
- }
左移位或者是右移位,while循環執行的次數取決於計算機的位數,32位的計算機就執行32次,而64位則要執行64次。而與運算的方法執行的次數,只與該數中1的個數有關。所以與運算方法,是三種方法中最好的一個。移動
相關的變形問題di
- 用一條語句判斷一個整數是否是2的整數次方。參考答案:if ( !(iN & (iN-1)) ){}
- 輸入兩個整數m和n,計算m和n對應的二進制中有多少個不一樣的位。參考思路:先對m和n進行異或,而後計算異或後的二進制結果中1的個數。