判断一个数字是不是2的k次方(这里不用考虑k的值)。
关于这个问题,要先从问题的本质入手:2的k次方的数字有哪些特点?
首先熟悉几个常见的(括号内是相应的二进制序列):
2(10) 4(100) 8(1000) 16(10000)
我们发现这些2的多少次方的数字呢,二进制序列都是只有唯一一个1的。
那么就从这里入手。介绍以下两个方法:
- 方法一
思路:将该数的二进制序列右移i位,直到遇到第一个1,然后判断这个数字是不是为1,如果为1的话,表示这个数的二进制序列只有一个1,即是2的次数。
代码实现:
package shujiazuoye;
import java.util.Scanner;
/*
* 如何判断一个数是不是2的几次方
* */
public class AboutTwo {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入你要判断的数字:");
int num=sc.nextInt();
aboutTwo(num);
}
private static void aboutTwo(int num) {
while((num&1)!=1){
num=num>>1;
}
if(num==1){
System.out.println("是2的k次方");
}else{
System.out.println("不是2的k次方");
}
}
}
2.方法2
思路:
假设这个数字为n,如果n&(n-1)为0,则n为2的k次方;假设n&(n-1)为1,则n不是2的k次方。
代码实现:
package shujiazuoye;
import java.util.Scanner;
public class AboutTwo1 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入要判断的数字:");
int num=sc.nextInt();
aboutTwo(num);
}
private static void aboutTwo(int num) {
if(((num)&(num-1))==0){
System.out.println("是2的k次方");
}else{
System.out.println("不是2的k次方");
}
}
}