5.判断整数是否为2的幂次方

  1. 5.判断整数是否为2的幂次方
    1. 5.1 题目
    2. 5.2 深入解析
    3. 5.3 答题示例
    4. 5.4 关键词联想

5.判断整数是否为2的幂次方


5.1 题目

给出函数判断一个整数是不是2的n次方。请问 if 语句中应该如何书写?


5.2 深入解析

n 为 2 的幂,其二进制中恰好有一个 1(如 8 = 0b1000)。此时 n - 1 会把该位变 0、低位全变 1,n & (n - 1) 必为 0。反之,若 n 有多个 1 位,则 n & (n - 1) 不为 0。注意先排除 n <= 0

时间复杂度 O(1),常作为位运算基础题。


5.3 答题示例

// 判断一个整数是否为2的幂次方
public bool IsPowerOfTwo(int n)
{
    // 如果 n <= 0,则不是2的幂次方
    if (n <= 0)
    {
        return false;
    }

    // 如果 n & (n - 1) 等于 0,则是2的幂次方
    return (n & (n - 1)) == 0;
}

思路:2 的幂在二进制中仅有一个 1;n-1 会把该位清 0、低位全置 1,故 n & (n-1) 为 0。若 n 有多个 1,则 n & (n-1) 仍非 0。先排除 n<=0


5.4 关键词联想

  • 位运算 &
  • 二进制表示
  • n & (n - 1) 消去最低位 1
  • 时间复杂度 O(1)


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏