public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int ret = 0;
while(n!=0)
{
n = n&(n-1);
ret++;
}
return ret;
}
}
好久没做题,最初的想法就是一位一位的与0x1与并累加,这样每一位都要循环,代价有点高,貌似会超时。
后来看了下网上的解法豁然开朗。
n = n&(n-1)....分析一下,若n末尾为1,则n-1末尾为0,其他位二者相同,与的结果是最末为1的那位变为0;若n末尾为0,之前最近为1的位置在j,则n-1从末尾到j+1都变为1,j位为0,之前的各位与n相同,那么与的结果实际上就是j位变为0,即最末为1的那位变为0. 综上发现n&(n-1)每次都会使n最末尾的1变为0,利用其我们只需要循环k词即可得到结果,而k即为n中为1的位的个数。
位运算一直没太接触过,实际开发中也很少用到,比较薄弱,这样的技巧应当牢记