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