10、二進位制中1的個數
阿新 • • 發佈:2019-01-07
題目
輸入一個整數,輸出該數二進位制表示中1的個數。其中負數用補碼錶示
我的解法
演算法分析:求出數字的二進位制表示,然後分正負數來計算1的個數。public int NumberOf1(int n) { int[] list = new int[32]; int res = 0; int temp = Math.abs(n); int index = 31; while (temp != 0) { list[index] = (temp % 2); temp = temp / 2; index --; } if (n < 0) { int mark = 1; for (int i = 31; i >= 0; i--) { int num = 1 - list[i]; list[i] = (num + mark) % 2; mark = (num + mark) / 2; } } for (int num : list) { res += num; } return res; }
答案解法
public int NumberOf1(int n) {
int res = 0;
while (n != 0) {
if ((n & 1) != 0)
res++;
n = n >>> 1;
}
return res;
}
演算法分析:一個int數字既是一個十進位制數字、又是一個二進位制位元數字,可以對其直接進行二進位制操作。則通過右移位來統計1個的個數。遍歷n次。
巧妙解法:遍歷k次,k為1個數
利用n & (n - 1)操作,相當於每執行一次,就把n的最右邊1去掉。那麼只需要k次,則n==0.