Java数据结构与算法之2的n次方断定

原理详见注释java

/* * 需求:判断一个数是否是2的n次方 */

/* * 分析: * 根据需求,先列出2的n次方的数据: * 1,2,4,8,16,32,64,128,..... * 能够获得如下公式 Sn = 2^n; * 所以可能使用循环来判断,开始编程 */
package com.wayne.example;

import java.util.Scanner;

public class JudgePow2 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println("我能够判断一个数字是否2的n次方。");
        System.out.println("请输入一个数字");
        Scanner sc = new Scanner(System.in);
        int goalNum = sc.nextInt();


        if(judgPowOf2(goalNum))
            System.out.println(goalNum+"知足条件!");
        else
            System.out.println(goalNum+"不知足条件!");

    }

// 方式一,经过循环来判断
// public static boolean judgPowOf2(int goalNum)
// {
// int result = 1;
// 
// while(result<=goalNum)
// {
// result<<=2;//此处使用移位,代替乘法,会提升效率
// 
// if(result == goalNum)
// {
// return true;
// }
// }
// 
// return false;
// }

// 方式二,经过按位与来判断
// 分析:
// 上述数据中,1,2,4,8,16,32,64,128,.....
// 若是转换成二进制,则是每个位置上的值,且其余位上均是0.
// 若是此值减1以后,剩余的位数都变成一,而该位变为0.
// 根据按位与运算的特色,两位同时为1的时候,才会返回1,
// 故此种状况下,他和他相邻的那个数,按位与后,结果为0.
// 所以也可用来判断
    public static boolean judgPowOf2(int goalNum)
    {
        return ((goalNum&(goalNum-1))==0);
    }

/* * 此题须要对数字和逻辑运算符比较熟悉,才会当即反应出相应的处理方式。 * 目前还没发现该方法有什么能够推广的。后面能够留意一下。 */
}