LeetCode位操作系列(2)——位运算的常用技巧:lowbit运算,包含lowbit公式、讲解、231题运用

什么是lowbit运算?


lowbit(n)运算是一个位运算的常用技巧,本题就可以直接用lowbit运算解决。
它的作用是求出n在表示成二进制的时候,最右边的1出现的位置对应的数。这么说有点晦涩,看俩例子就懂了,其实很简单:

lowbit(4) = lowbit(100) = 100
lowbit(5) = lowbit(1001) = 1
lowbit(6) = lowbit(1010) = 10

lowbit公式

lowbit公式非常简单:

lowbit(n) = n & -n    //其中-n表示n的补码

lowbit的运用

(1)leetCode231题:给定一个整数x,编写一个函数来判断它是否是 2 的幂次方。

解题思想:我们知道2的幂次方的二进制数只有最左边一位是1,其他为全是0,这是lowbit(x)=x。

 

public boolean isPowerOfTwo(int n) {
        return n>0&&(n&-n)==n;
}

另一种解法:回顾我们十进制转二进制的算法,

// 比如7转成二进制
7/2=3.....1
3/2=1.....1
1/2=0.....1
// 则7的二进制为111

// 比如8转成二进制
8/2=4.....0
4/2=2.....0
2/2=1.....0
1/2=0.....1
// 则8的二进制为1000
我们可以观察到,对于非2的幂次数,它的非最左边一位一定会有出现1的;
所以我们在循环对2模、除的时候,如果在最后一次模、除之前余数出现了1,就返回false,否则,如果遍历完,则返回true
public boolean isPowerOfTwo(int n) {
    if(n<=0) return false;
    if(n==1) return true;

    // 直接在最后一次模、除之前结束循环
    while(n>1){
        int c=n%2;
        if(c==1) return false;
        n/=2;

    }
    return true;
}

参考资料:https://leetcode-cn.com/problems/power-of-two/solution/wei-yun-suan-de-chang-yong-ji-qiao-lowbityun-suan-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

posted @ 2020-02-02 22:04  SupremeBoy  阅读(452)  评论(0编辑  收藏  举报