這是今年某公司的面試題:
一般思路是:把整數n轉換成二進制字符數組,然后一個一個數:
private static int helper1(int i) { char[] chs = Integer.toBinaryString(i).toCharArray(); int res = 0; for (int j = 0; j < chs.length; j++) { if (chs[j] == '1') { res++; } } return res; }
第二種方法是:將整數n與1進行與運算,當整數n最低位是1時,則結果為1,否則結果為0。 然后將1左移一位,繼續與n進行與運算,當次低位是1時,結果非零,否則結果為0。循環以上操作,記錄非零的次數即可。
public static int helper2(int n ){ int count = 0; int flag = 1; while(flag <= n){ if((n&flag) != 0) count++; flag = flag<<1; } return count; }
第三種方法是:將整數n與1進行與運算,當整數n最低位是1時,則結果為1,否則結果為0。 然后將 n 右移一位,繼續與 1 進行與運算。循環以上操作,直到n=0結束,記錄非零(為1)的次數即可。
private static int helper3(int n) { int res = 0; while (n!=0) { if ((n&1) == 1) { res++; } n = n>>1; } return res; }
第四種方法是:將整數n與(n-1)進行與運算:把一個整數減去1,再和原整數做與運算,會把該整數最右邊一個1變成0。那么一個整數的二進制表示中有多少個1,就可以進行多少次這樣的操作。從而可以減少比較的次數。
private static int helper4(int n) { int res = 0; while (n!=0) { res++; n = n&(n-1); } return res; }
Over...
參考:
