以在下的水平,首先想到的是除和取整,如果取整有1就加1,然后就超时了,除的效率要比位运算低很多,面试官会问的哦
果然要用博大精深的位运算,用n和1进行与运算,(其实就是比末位),假设取得数是n,那么我们有两个思路,第一个是n右移(比倒数第二位),直到n变为0;第二个思路1左移,第一次左移就是10,其实也是比第二位;
两种思路有什么区别呢?第一种会引起死循环,比如int型,第一个数字是符号位,1为负,0为正,那么如果是负数的话,为了保证它始终为负,首位会始终是1,产生死循环;第二种靠谱
public class Solution {
public int NumberOf1(int n) {
int count = 0;
int flag = 1;
while(flag!=0){
if((n&flag)!= 0){
count += 1;}
flag = flag << 1;}
return count;
}
}
python实现失败了,不明觉厉,找个答案看看
# -*- coding:utf-8 -*-
class Solution:
def NumberOf1(self, n):
num = n
flag = 1
count = 0
while flag<=0xffffffff:
if num & flag:
count += 1
flag = flag << 1
return count