【轉】判斷一個整數轉換成二進制後1的個數

判斷一個整數轉換成二進制後1的個數,大體有三種方法,分別是左移位、右移位和與運算spa

第一種方法:右移位class

        右移位的基本思路是,先將整數轉換成正整數,再將該數與1進行與運算。若不將整數作取絕對值處理,當輸入的數是負數時,每向右移動一位,高位會自動補1,就會致使死循環循環

 
  1. int ChargeOnesCountInNum1(int iNum)  
  2. {  
  3.     int iCount=0;  
  4.     iNum = abs(iNum);//注意添加上了絕對值  
  5.     while(iNum){  
  6.         if (iNum & 1){  
  7.             ++iCount;  
  8.         }  
  9.         iNum = iNum >> 1;  
  10.     }  
  11.   
  12.     return iCount;  
  13. }  

 

第二種方法:左移位二進制

        左移位的基本思路和右移位相同。方法

 
  1. int ChargeOnesCountInNum2(int iNum)  
  2. {  
  3.     int iCount=0;  
  4.     unsigned int iFlag = 1;  
  5.     iNum = abs(iNum);//注意添加上了絕對值  
  6. </span>   while(iFlag){  
  7.         if (iNum & iFlag){  
  8.             ++iCount;  
  9.         }  
  10.         iFlag = iFlag << 1;  
  11.     }  
  12.       
  13.     return iCount;  
  14. }  

 

第三種方法:與運算word

        將一個整數減去1以後,其對應的二進制中最右邊的一個1會變爲0,若其後存在0,則其以後的全部0都會變爲1。基於此,設一個整數爲n,則 n & (n-1)以後,會消掉n對應的二進制的最右邊的1。所以,將一個數中全部1消掉所用的次數,即爲該整數對應的二進制中1的個數。計算機

 
  1. int ChargeOnesCountInNum3(int iNum)  
  2. {  
  3.     int iCount=0;  
  4.     iNum = abs(iNum);//注意添加上了絕對值  
  5.     while(iNum){  
  6.         ++iCount;  
  7.         iNum = iNum & (iNum-1);  
  8.     }  
  9.       
  10.     return iCount;  
  11. }  

        左移位或者是右移位,while循環執行的次數取決於計算機的位數,32位的計算機就執行32次,而64位則要執行64次。而與運算的方法執行的次數,只與該數中1的個數有關。所以與運算方法,是三種方法中最好的一個。移動

 

相關的變形問題di

 

  • 用一條語句判斷一個整數是否是2的整數次方。參考答案:if ( !(iN & (iN-1)) ){}
  • 輸入兩個整數m和n,計算m和n對應的二進制中有多少個不一樣的位。參考思路:先對m和n進行異或,而後計算異或後的二進制結果中1的個數。
相關文章
相關標籤/搜索