(笔记)LeetCode231 Power of Two题解

第一种方式:使用模运算 

 /**
     * 判断n是否是2的幂次方
     *
     * 一、
     *      1 是 2的0次幂
     *      2 是 2的1次幂
     *      4 是 2的2次幂
     *      8 是 2的3次幂
     *      16是 2的4次幂
     *
     * 二、
     *      2/2 商1 余0
     *      4/2 商2 余0
     *      8/2 商3 余0
     *      16/2 商4 余0
     *
     * 假如一开始 n=16,那么执行步骤如下:
     *    while(16 >= 2 && 16 % 2 == 0)   该表达式为true,进入循环
     *      n = 16 / 2                    执行完该段代码 n=8
     *    while(8 >= 2 && 8 % 2 == 0)     该表达式为true,进入循环
     *      n = 8 / 2                     执行完该段代码 n=4
     *    while(4 >= 2 && 4 % 2 == 0)     该表达式为true,进入循环
     *      n = 4 / 2                     执行完该段代码 n=2
     *    while(2 >= 2 && 2 % 2 == 0)     该表达式为true,进入循环
     *      n = 2 / 2                     执行完该段代码 n=1
     *    while(1 >= 2 && 1 % 2 == 0)     该表达式为false,退出循环
     *
     * 接下来判断 n是否等于1:
     *   return n == 1;     1 == 1为true,返回true
     *
     * 结论:
     *   (1)如果n是2的幂次方,进入循环,在循环中不断地将n除2,那么循环结束n肯定等于1,最后返回true。
     *   (2)如果n不是2的幂次方,比如n=5,不满足循环条件while(5 >= 2 && 5 % 2 == 0),则不会进入循环,因为5%2等于1,接下来判断5 == 1,表达式为false,然后返回
     *
     * @param n
     * @return
     */
    public static boolean isPowerOfTwo(int n) {
        if (n <= 0) {
            return false;
        }
        if (n == 1) {
            return true;
        }
        while (n >= 2 && n % 2 == 0) {
            n /= 2;
        }
        return n == 1;
    }

第二种方式:使用位运算

/**
     * 使用位运算
     * 
     * 假如n=16
     *      n的二进制数为:    1 0 0 0 0 
     *      n-1的二进制数为:  0 1 1 1 1
     *  
     *  那么,(n & (n - 1)) == 0,也就是 16 & 15 == 0
     *  对应的二进制运算就是:
     *      1 0 0 0 0
     *      0 1 1 1 1   &
     *      0 0 0 0 0
     *  
     *  16&15的计算结果为00000
     *  0的二进制数也是00000
     *  所以,表达式为true
     *
     * @param n
     * @return
     */
    public static boolean isPowerOfTwo(int n) {
        return n != 0 && (n & (n - 1)) == 0;
    }

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值