原理详见注释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);
}
/* * 此题须要对数字和逻辑运算符比较熟悉,才会当即反应出相应的处理方式。 * 目前还没发现该方法有什么能够推广的。后面能够留意一下。 */
}