二进制中1的个数

来源:互联网 发布:出柜后父母反对知乎 编辑:程序博客网 时间:2024/06/05 02:32

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
解题思路:
因为在2进制中负数是以补码的形式表示的,而由于python中整数是不限制长度的,bin(3)=0b11,bin(-3)=-ob11,无法计算负数中的1的个数,所以可以通过bin(2**32-3)来表示32位的-3的补码形式(这里利用了同余的概念,补码本身也是利用这一概念。),这样就可以计算负数的1的个数了。
解法1:

class Solution:    def NumberOf1(self, n):        return bin(n).replace("0b","").count("1") if n>=0 else bin(2**32+n).replace("0b","").count("1")

解法2:

class Solution:    def NumberOf1(self, n):    # 虽然运行通过了,前提是整数是32位的!!        count = 0        for i in range(32):            if n & 1:                count += 1                n = (n >> 1)        return count

解法3:

'''直接构建补码,这个也只对32位的有效果'''class Solution:    def NumberOf1(self, n):        sum = 0        #n < 0        if n < 0:            n = (~((-1)*n) + 1) #因为没有符号位,所以如果是32位,则相当于第32位0取反为1,已经可以表示负数的补码了            print("n=%d" % (n))        elif n == 0:            return 0        for i in range(0,32):            if n & 1 == 1:                sum += 1            n >>= 1        return sum

解法4:

class Solution:    def NumberOf1(self, n):        # write code here        count = 0        if n < 0:            n = n & (0xFFFFFFFF) #这一步的作用就是限制补码的长度,因为n进行&运算的时候就是用补码,对于-1来讲,不管是多少位,在高位补码都是1,这样运算可以得出表示出补码。        while (n != 0):            count+=1            n = n & (n-1) #n-1只会对最后一个1产生影响变为0,1后面的的0全部变成1,当运算后n的值只有最后一位改变,当n不等于0时继续运算,等于0时循环停止,所以在循环开始的时候count可以直接加上1        return count

以上解法全部来自牛客网,我python的答案我没写出来!

原创粉丝点击