Leetcode 学习计划之21天算法 (十三)

这篇博客介绍了如何利用位运算高效地判断一个整数是否为2的幂以及计算整数中位1的个数。提供了两种不同的方法:一是通过按位与操作`n&(n-1)`来判断2的幂,二是通过不断右移并计数来计算位1的数量。这些位运算技巧在计算机科学和编程中具有重要作用。
摘要由CSDN通过智能技术生成

第13天 位运算

231.2的幂

1、按位与 注意特判,如果是0先return False。其余情况都是 return not(n & (n-1)) 。

将2的幂次方写成二进制形式后,很容易就会发现有一个特点:二进制中只有一个1,并且1后面跟了n个0; 因此问题可以转化为判断1后面是否跟了n个0就可以了。

如果将这个数减去1后会发现,仅有的那个1会变为0,而原来的那n个0会变为1;因此将原来的数与去减去1后的数字进行与运算后会发现值为零。
而负数在计算机中以补码形式表示,最高位始终为1,所以按位与后不可能为0,所以也满足这个方法。

class Solution(object):
    def isPowerOfTwo(self, n):
        """
        :type n: int
        :rtype: bool
        """
        if n == 0:
            return False
        return not(n & (n-1))

# 还有一种判断方法: (n&-n) == n

 2、常规判断。while n%2为0,n除以2,最后看n是否为1,是则为True,否则为False。

class Solution(object):
    def isPowerOfTwo(self, n):
        """
        :type n: int
        :rtype: bool
        """
        if n <= 0:
            return False
        if n==1:
            return True
        while n%2 == 0: 
            n = n // 2
        if n == 1:
            return True
        else:
            return False

191.位1的个数

思路:

1、位运算(1)不断右移跟1做与运算 (2)n=n&(n-1) 每次都可以把最低位的1变成0

class Solution(object):
    def hammingWeight(self, n):
        """
        :type n: int
        :rtype: int
        """
        ans = 0
        while(n):
            ans += n&1
            n >>= 1
        return ans

class Solution(object):
    def hammingWeight(self, n):
        """
        :type n: int
        :rtype: int
        """
        ans = 0
        while(n):
            ans += 1
            n = n & (n-1)
        return ans

2、转为字符串

class Solution(object):
    def hammingWeight(self, n):
        """
        :type n: int
        :rtype: int
        """
        s = str(bin(n))
        ans = 0
        for i in s:
            if i == '1':
                ans+=1
        return ans

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值