題目來源:力扣
題目描述:
請實現一個函數,輸入一個整數,輸出該數二進制表示中 1 的個數。例如,把 9 表示成二進制是 1001,有 2 位是 1。因此,如果輸入 9,則該函數輸出 2。
============================================================
示例 1:
輸入:00000000000000000000000000001011
輸出:3
解釋:輸入的二進制串 00000000000000000000000000001011 中,共有三位爲 ‘1’。
==============================================================
you need to treat n as an unsigned value
審題:
對於該問題, 我們可以對整數逐位移位, 判斷每一位是否爲1, 統計爲1的位數.由於題目要求將整數n看作無符號整數, 因此我們在移位時需要使用無符號的移位方法.
public class Solution {
public int hammingWeight(int n) {
int res = 0;
while(n != 0) {
res += n & 1;
n >>>= 1;
}
return res;
}
}
另一個更巧妙的方法是將n與n-1進行與運算, 比較n與n-1的二進制位可以發現, n最右側的1對應n-1爲0, 而往左的各位則相同, 因此將n與n-1進行或運算 可以將最右側的1變爲0;
public class Solution {
public int hammingWeight(int n) {
int res = 0;
while(n != 0) {
res++;
n &= n - 1;
}
return res;
}
}