17. 二進制中的1的個數
問題描述
請實現一個函數,輸入一個整數,輸出該數二進制表示中1的個數。例如把9表示成二進制是1001,有2位是1。因此如果輸入9,該函數輸出2。
分析
一個數內部都是0 1 ,我們要檢測內部 1 的個數的話
我們可以將這個數不斷右移,直到它爲0 爲止,提一下,這個是錯誤的,正數可以做出來,負數呢,右移之後補1 ,死循環了啊,撲街
-
常規解法
我們可以設置一個數 從1 開始,不斷左移這個數,然後讓他和n做比較,如果不爲0 那就說明這個位上是1,這個方法有個缺點,就是循環的次數等於整數二進制中的位數,32位的整數需要循環32次
public static int NumberOf1Solution2(int n) { int count = 0; int flag = 1; while (flag >= 1) { if ((n & flag) > 0) { count++; } flag = flag << 1; } return count; }
-
有幾個1就移動幾次
假設我們 n = 3 換成二進制也就是 11 ,如果我們將這個數減1 判斷它是不是與(n)相與結果爲0的話,只需要減2次就行了剛好是其中1的個數,如果是 n = 4,也就是 100,我們將這個數減1(011),與(100)相與剛好爲0,所以這個數中只有一個1 。
簡言之就是:把一個整數減去1,再和原整數做與運算,會把該整數最右邊一個1變成0。那麼一個整數的二進制表示中有多少個1,就可以進行多少次這樣的操作。
public static int NumberOf1Solution3(int n) { int count = 0; while (n != 0) { count++; n = (n - 1) & n; } return count; }
完整代碼:
import com.sun.org.apache.xpath.internal.operations.Number;
/**
* Class day17 ...
*
* @author LiJun
* Created on 2019/1/11
*/
public class day17 {
private static int solution(int n) {
int count = 0;
while (n != 0) {
count++;
n = (n - 1) & n;
}
return count;
}
public static int NumberOf1Solution2(int n) {
int count = 0;
int flag = 1;
while (flag >= 1) {
if ((n & flag) > 0) {
count++;
}
flag = flag << 1;
}
return count;
}
public static void main(String[] args) {
System.out.println(solution(-1));
}
}