// 面試題15:二進位制中1的個數
// 題目:請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中1的個數。例如
// 把9表示成二進位制是1001,有2位是1。因此如果輸入9,該函式輸出2。
1)常規思路:
首先考慮位與運算,每次都讓目標數字和1做位與運算,然後將目標數字右移一位,
多少次結果為1,目標數字轉化為二進位制後就有多少個1.
但是這樣做的話,忽略了負數的情況,負數右移後,高位補1,我們寫的函式就會變成死迴圈。
所以需要進行一些改進,目標數字不變,對n從1不斷向右移。
我們可以提高演算法的效率,目標數字轉化為二進位制有多少個1就迴圈幾次。
乙個二進位制數字n,如果不為0,那麼它至少有一位是1。
如果右起第1位為1,n-1高位不變,最後一位變為0,(n-1)&n就會消除掉乙個1.
如果右起第1位不為1,右起第乙個1位於第m位,n-1第m位變為0,m-1到第1位都變為1,
那麼(n-1)&n仍然消除掉乙個1.
重複這個過程,直到n被消除為0,比第一種方法少了迴圈次數,效率也會提高。
int numberof1_solution1(int n)return count;
}int numberof1_solution2(int n)
return count;
}
面試題15 二進位制中1的個數
題目 請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中1的個數。例如把9表示成二進位制是1001,有2位是1。因此如果輸入9,該函式輸出2。includeusing namespace std int numof1 int n flag flag 1 return count int main ...
面試題15 二進位制中1的個數
請實現乙個函式,輸入乙個整數,輸出該整數的二進位制表示中1的個數。例如,把9表示成二進位制是1001,有2個是1。因此,如果輸入9,則該哈數輸出2。如果輸入負數,則統計該數字二進位制補碼中的1的個數。先判斷二進位制中最右邊一位是不是1 接著把輸入的整數右移一位,此時原來處於從右邊數起第二位被移到最右...
面試題15 二進位制中1的個數
題目 請實現乙個函式,輸入乙個整數,輸出改數的二進位制表示中1的個數 常規解法 思路 通過與運算來判斷某乙個是否為1。該數先和1相與,如果結果為1,則第一位為1,然後1左移一位與該數相與,判斷第二位是否為1 以此類推,即可判斷該數的二進位制中有多少個1。int getnumofoneinbinary...