面试10:二进制中1的个数

【题目】输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
【思路】
一个数n,假设二进制个位上是1,则n-1后,个位上为0,其它位不变,如111-1变为110
假设n最右边m位为1,比如1100,右边第三位为1,n-1为1011,变化规律为m位变0,m位右边全为1,m位左边不变,故n与n-1按位与后,可留下m位左边的1。故为1的个数即为按位与不为0的次数。
注意边界条件:

【代码】

class Solution:
    def NumberOf1(self, n):
        INT_BITS = 32 
        MAX_INT = (1 << (INT_BITS - 1)) - 1 
        # write code here
        count = 0
        #进入循环,则n含有1
        while (n!=0):
            if n < - MAX_INT - 1 or n > MAX_INT + 1:
                break
            count+=1
            n = n & (n-1) #按位与
        return count

你可能感兴趣的:(面试10:二进制中1的个数)