码迷,mamicode.com
首页 > 其他好文 > 详细

剑指offer:二进制中1的个数

时间:2019-04-18 23:27:06      阅读:280      评论:0      收藏:0      [点我收藏+]

标签:turn   class   因此   ==   pre   注意   ffffff   位置   +=   

题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

class Solution:
    def NumberOf1(self, n):
        """
        给定一个数n,将n和(n-1)做位与运算可以将最后一个1变成0.
        假设n的最后一个1在第m位,则将n-1之后,第m位由1->0,第m位以后的位全部取反,
        第m位以前的位保持不变。因此我们得到一个结论:n & (n-1)可以将n的最后一个1变成0。

        当给定的数字是正数的时候,我们可以直接按照上面的结论去计算二进制中1的个数。
        但是如果给定的数字是复数的话,当n变成除了符号位,其它都为0的时候,n-1会保持符号位不变,
        将其他位取反,导致循环无法终止。
        考虑32位整数,如果是复数,符号位为1111,那么我需要将最高位符号位置为0来确保循环得到终止,
        因此将n &= 0x7fffffff,并将num+=1,因为最高位符号位是1,已被我们置为0
        """
        num = 0
        # 将符号位置为0,注意这里num += 1
        if n < 0:
            n &= 0x7fffffff
            num += 1
        # n & (n-1)可以将n的最后一个1变成0
        while n != 0:  # 将一个数减去1
            num += 1
            n = (n - 1) & n

        return num

    def isPowOf2(self, n):
        """
        给定一个整数n,判断是否是2的整数次幂
        """
        if n <= 0:
            return False
        n &= n - 1  # 如果n是2的整数次幂,那么二进制中只有1个1,去掉之后n变为0
        return n == 0

    def binaryDistance(self, n, m):
        """
        给定n和m,需要改变n的多少位才能得到m
        """
        dist = n ^ m
        num = 0
        if dist < 0:
            num += 1
            dist &= 0x7fffffff

        while dist != 0:
            dist &= dist - 1
            num += 1

        return num

剑指offer:二进制中1的个数

标签:turn   class   因此   ==   pre   注意   ffffff   位置   +=   

原文地址:https://blog.51cto.com/jayce1111/2381096

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!