請實現乙個函式,輸入乙個整數,輸出該整數的二進位制表示中1的個數。例如,把9表示成二進位制是1001,有2個是1。因此,如果輸入9,則該哈數輸出2。如果輸入負數,則統計該數字二進位制補碼中的1的個數。
先判斷二進位制中最右邊一位是不是1;接著把輸入的整數右移一位,此時原來處於從右邊數起第二位被移到最右邊了,再判斷是不是1;這樣每移動一位,直到整個整數變成0為止。判斷最右邊一位是不是1,只需要將這個數和1做與運算看結果是不是0就知道了。
假設,這個數字是負數,在右移的過程中,要保持最左邊一位符號位不變,最左側新增乙個1,在不斷右移的過程中,這個數字最終變成了0xffffffff,於是就陷入了死迴圈。
為了避免死迴圈,我們可以不右移數字,而是不斷的左移1,從而判斷每一位是1還是0。
考慮將數字減去1。假設二進位制數字是1111,減去1是1110;假設數字是1100,減去1是1011。將1111和1110做與運算得到1110,將1100和1011做與運算得到1000。對於1111到1110,最後乙個1不見了,對於1100到1000,也是最後乙個1不見了。所以,可以通過n&(n-1)的方式不斷去掉二進位制中最後乙個1,當這個數字變成0的時候,就能統計出來1的數量了。此時的時間複雜度由二進位制中1的數量決定,而不是二進位制的位數決定,這是乙個常數級別的優化。
package com.wsy;
public class main
public static int getcountof1(int n)
n >>= 1;
}return count;
}}
package com.wsy;
public class main
public static int getcountof1(int n)
flag <<= 1;
}return count;
}}
package com.wsy;
public class main
public static int getcountof1(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的個數 常規解法 思路 通過與運算來判斷某乙個是否為1。該數先和1相與,如果結果為1,則第一位為1,然後1左移一位與該數相與,判斷第二位是否為1 以此類推,即可判斷該數的二進位制中有多少個1。int getnumofoneinbinary...
面試題15 二進位制中1的個數
題目 請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中1的個數。例如,把9表示成二進位制是1001,有2位是1。因此,如果輸入9,則該函式輸出2。可能引起死迴圈的解法 先判斷整數二進位制表示中最右邊一位是不是1 接著把輸入的整數右移一位,此時原來處於從右邊數起的第二位被移到最右邊了,再判斷是不是...