1. 程式人生 > 實用技巧 >劍指office--------二進位制中1的個數

劍指office--------二進位制中1的個數

題目描述

輸入一個整數,輸出該數32位二進位制表示中1的個數。其中負數用補碼錶示。 思路1:常規解法,位運算
 1 class Solution {
 2 public:
 3      int  NumberOf1(int n) {
 4          int ans=0;
 5          int index=1;
 6          while (index!=0){
 7              if (n&index)    ans++;
 8              index<<=1;
 9          }
10          return
ans; 11 } 12 };

思路2:利用二進位制特點

 1 class Solution {
 2 public:
 3      int  NumberOf1(int n) {
 4          int count=0;
 5          while (n){
 6              count++;
 7              n=(n-1)&n;
 8          }
 9          return count;
10      }
11 };

n-1是將 二進位制n中的最右的1變成0的操作 ,例如 101000 減去1 的 100111

(n-1)&n 則是消除最右邊的1的操作 101000 & 100111  =  100000

即每操作一次就可以消除一個1。

用這個方法也可解下列問題

問題1: 判定一個整數是否是2的整數次方

    如果是2的整數次方,那麼其的二進位制只有一個1, 即:if((n-1)&n==0)  printf("YES\n");

問題2: 兩個整數n與m,問最少要改變多少個數字(對其二進位制操作),可以使n與m相等。

    

    先對n與m取異或。在統計有多少個1即可。