剑指offer二进制中1的个数

以在下的水平,首先想到的是除和取整,如果取整有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

猜你喜欢

转载自blog.csdn.net/qq_17641711/article/details/82856321