剑指offer算法题【14】:二进制中1的个数(位运算)

题目

输入一个整数,输出该数二进制表示中1的个数。

容易引起死循环的解法

 def solution1(self,n):
        count = 0 # 用于计算1的个数
        while n: # 只要还不等于0
            if (n & 1): # 如果n和1相与为1,代表最低位为1,其中&表示位运算
                count+=1
            n = n >> 1 # 右移一位使得原来的第二位变成现在的第一位
        # 这种方式为什么会引起死循环,因为当n为负数的时候,显然最左边会补1,这种情况下根本就没办法停止循环
        return count

常规解法 

    def solution2(self,n):
        count = 0
        flag = 1 # 上一个方法是移动数字n,这次我们移动数字1即可。
        while flag:
            if (n & flag): # 若位运算结果为1,则那一位为1
                count += 1
            flag = flag << 1 # 将1左移一位
        return count

会给面试官带来惊喜的解法

一个整数减去1,可以将其最右边第一个1一直到最右边为止的所有数位取反。如:
1011−1=1010 

1100−1=1001 

利用这个性质,原数和减去1之后的数做与运算,则可以去掉原数最右边的一个1,有多少个1就可以做多少次这样的运算。

 def solution3(self,n):
        count = 0
        while n:
            count += 1
            n = n & n-1
        return count

 

发布了234 篇原创文章 · 获赞 71 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章