• 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)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    【TopCoder
    【TopCoder
    min_25筛学习笔记
    min_25筛学习笔记
    【SPOJ】 —DIVCNTK(min_25筛)
    【SPOJ】 —DIVCNTK(min_25筛)
    【UOJ#13 188】—Sanrd(min_25筛)
    【UOJ#13 188】—Sanrd(min_25筛)
    【BZOJ5244】【FJWC2018】—最大真因数(min_25筛)
    【BZOJ5244】【FJWC2018】—最大真因数(min_25筛)
  • 原文地址:https://www.cnblogs.com/SupremeBoy/p/12253965.html
Copyright © 2020-2023  润新知