栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【LeetCode231】2的幂(n & (n - 1) == 0或n & (-n) == n)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【LeetCode231】2的幂(n & (n - 1) == 0或n & (-n) == n)

文章目录

一、题目二、思路三、代码

一、题目


二、思路

要是2的幂,可以回想二进制数中,什么样的二进制数对应的十进制是2的幂呢,就是在二进制数中,只有一个1,其余都是0。所以我们只需要判断给定的数的二进制数,如果只有一个1则返回true了。

位运算的技巧:

n & (n - 1)可以将n的二进制位的最低位1移除。如1000和0111做与运算后得到0000,即将1000的最低位的1移除了,然后再判断其余位是否都是0。所以我们可以n > 0 && (n & (n - 1)) == 0进行判断。n & (-n)即n与其相反数做与运算。由于负数是按照补码规则在计算机中存储的,−n 的二进制表示为 n 的二进制表示的每一位取反再加上 1。有关n & (-n)的结论:如果n是真整数n & (-n) == n,则n是2的幂。
简单证明:假如n的二进制位为 ( a 10...0 ) 2 (a10...0)_{2} (a10...0)2​(其中a为若干个高位,是0或1都行),则-n每位按位取反,加1后为 ( a ˉ 01 ⋯ 1 ) 2 + ( 1 ) 2 = ( a ˉ 10 ⋯ 0 ) 2 (bar{a} 01 cdots 1)_{2}+(1)_{2}=(bar{a} 10 cdots 0)_{2} (aˉ01⋯1)2​+(1)2​=(aˉ10⋯0)2​然后n & (-n)运算后,结果的高位全部为0,最低位的1和后面的0都没有变化,因此我们可以用n > 0 && (n & -n) == n判断这题。 三、代码

class Solution {
public:
    bool isPowerOfTwo(int n) {
        //return n > 0 && (n & (n - 1)) == 0;  //法二
        return n > 0 && (n & -n) == n;
    }
};
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/766822.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号