• LeetCode 231. Power of Two


    Given an integer, write a function to determine if it is a power of two.

    Credits:
    Special thanks to @jianchao.li.fighter for adding this problem and creating all test cases.

    题意:给定一个整数,判断其是否为2的n次方。

    方法一:直接判断。

    public boolean isPowerOfTwo(int n) {
            if(n < 1)
                return false;
            while(n > 1){
                if(n % 2 != 0)
                    return false;
                n /= 2;
            }
            return true;
        }

    方法二:利用2的n次方数的二进制形式的特点:2的n次方数的二进制只有高位1个1,剩下均为0.

    例:十进制:1,二进制:1; 

      十进制:2,二进制:10;

      十进制:4,二进制:100;

      十进制:8,二进制:1000;

     判断n的最低位是否为1,然后将n右移一位,判断n是否只存在唯一一个1

    public boolean isPowerOfTwo(int n) {
            if (n <= 0)
                return false;
            while (n != 0) {
                int bit = n & 1;//判断最低位是否为1,如果最低位为1,则bit=1;否则bit=0
                n = n >>> 1;//n向右移一位
                if (bit == 1 && n != 0) {//未右移前的n最低位为1,且右移一位后的n'不为0。说明未右移前的n至少存在两个1
                    return false;
                }
            }
            return true;
        }

    方法三:使用n&(n-1)来判断一个数是否是2的方幂

    public boolean isPowerOfTwo(int n) {
            return n > 0 && ((n & (n - 1)) == 0 ); 
        }

     关于n&(n-1)

    n&(n-1)可以将n的二进制表示中的最低位为1的改为0(即将n的二进制中的最后一个1改为0)。因此,如果n的二进制只有1个1,经过n&(n-1)就会变成0了。

    &的运算规则:仅当对应位的两个数都为1时,结果才为1;否则为0。

    例:4的二进制是100,4 - 1 = 3,3的二进制是11,4 & 3 = 000. 将4的二进制100中的最低位的1(100的最低位的1即其仅有的1)变成了0

      5的二进制是101,5 - 1 = 4,4的二进制是100,5 & 4 = 100. 将5的二进制101中的最低位的1变成了0

  • 相关阅读:
    圣诞节快乐 | 圣诞特效来了!!
    前端特效demo | 值得收藏的6个 HTML5 Canvas 实用案例
    前端特效demo | 一起围观 10 种创意时钟
    即学即用,轻松搞定这些选择器!(下)
    架构师究竟要不要写代码?
    偷懒秘诀之变量篇
    弹幕,是怎样练成的?
    [C++]模板类和模板函数
    [C++]typedef用法
    [面试]CVTE 2019提前批 Windows应用开发一面
  • 原文地址:https://www.cnblogs.com/zeroingToOne/p/8186009.html
Copyright © 2020-2023  润新知