【劍指offer】輸入一個整數,輸出該數二進位制表示中1的個數,其中負數用補碼錶示。
阿新 • • 發佈:2018-12-23
題目要求
輸入一個整數,輸出該數二進位制表示中1的個數。其中負數用補碼錶示。
核心思路
- 如果一個整數不為0,那麼這個整數至少有一位是1,如果把這個整數減1,那麼原來整數最右邊的1就會變為0,原來在1右邊的所有0都會變為1。那麼,利用n = n & (n - 1),如1100 & 1011 = 1000,也就是說,把整數減1,再和原數進行與運算,就會消去一個1。利用這個特性我們就可以算出1的個數。
- 把整數轉換為二進位制字串,把字串轉為char陣列,再進行遍歷計算。
完整程式碼如下
/**
*輸入一個整數,輸出該數二進位制表示中1的個數。其中負數用補碼錶示。
*/
public class Solution {
//核心思想:n = n & (n-1)
public int NumberOfOne1(int n) {
if(n == 0)
return 0;
int count = 0;
while(n != 0) {
n = n & (n-1);
count++;
}
return count;
}
//核心思想:字串陣列
public int NumberOfOne2(int n) {
int count = 0;
char[] charArray = Integer.toBinaryString (n).toCharArray();
for (int i = 0; i < charArray.length; i++) {
if (charArray[i] == '1') {
count++;
}
}
return count;
}
public static void main(String[] args) {
Solution sl = new Solution();
System.out.println(sl.NumberOfOne1(5));
System.out.println(sl.NumberOfOne2(5));
}
}