判断一个数字是否为2的阶次方数
8,64,256都是2的阶次方数(例8是2的3次方),用java编写程序,用两种方法来判断一个整数是不是2的阶次方数,并说明哪个方法更好。 

解决方案 »

  1.   

    http://blog.csdn.net/ZangXT/archive/2008/10/31/3193497.aspx
      

  2.   

    public class Main{
        public static void main(String[] args) {
             for(int i=2;i<1000;i++){
                 if((i&(i-1))==0){
                     System.out.println(i);
                 }
             }
        }
    }正解!
      

  3.   

    如果给定的数字是负数或者0, 报错
    如果给点的数字是1, 返回0, 因为任何数的0次方都为0;
    对于其他的数字,可进行如下判断:
       在循环中,每次循环都将一个临时变量(初始值为1)乘以2;
       同时计数器(初始值为0)加1;
       如果得出的结果 > 给定的数,说明它不是2的阶乘;
       如果得出的结果 = 给定的数,说明它是2的阶乘,具体的阶乘输就是计数器的值;
       如果得出的结果 < 给定的数, 继续循环方法2的话,就是上述方法的逆操作  
       在循环中判断对给定的数进行除以2的运算呵呵,这是个笨方法~
      

  4.   

    public class Test {
    public static void main(String[] args)
    {
    if(new Test().isJieCi(256))
    {
    System.out.println("该数字是为2的阶次方数");
    }
    }
    public boolean isJieCi(int i)
    {
    boolean b = false;
    if(i%2 == 0)
    {
    b=true;
    }
    return b;
    }
    }
      

  5.   


    public static void cacu(int a){
    if(a%2!=0){
    System.out.println("很明显不符合要求!");
    return;
    }
    for(int i=1; i<Integer.MAX_VALUE; i*=2){
    if(a == i){
    System.out.println(i + " 符合要求!");
    break;
    }
    }
    }
    贴个常规的方法,不太好,如果是偶数,而又不是2的阶次方的话就很麻烦……
      

  6.   


    public class JiSuan { public static void main(String[] args) {
    int a = 107375;
    int b = 256;
    cacu(a);
    cacu(b);
    }
    public static void cacu(int a){ for(int i=1; i<=Integer.MAX_VALUE/2+1; i*=2){
    if(a == i){
    System.out.println(i + " 符合要求!");
    return;
    }
    if(i == Integer.MAX_VALUE/2+1){
    System.out.println(a + " 不符合要求");
    return;
    }
    }
    }
    }
    这次没问题了,感觉也还不错,比较容易想到,最多31次循环,也不复杂。
      

  7.   


        public static void main(String[] args) 
    {
             for(int i=2;i<1000;i++)
            {
                 if((i&(i-1))==0)
                 {
                     System.out.println(i);
                 }
             }
    }
    很准确,也很有效率
      

  8.   

    7楼的大哥,你的结果不对。if(new Test().isJieCi(14)) 运行结果:该数字是为2的阶次方数,
      

  9.   

    我也贡献一个吧
    public class StringTest { /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
           int n=32;
           if(jieC(n))
            System.out.println(n+"是2的阶乘!");
           else
            System.out.println(n+"不是2的阶乘!");
    }

    public static boolean jieC(int n){
    if(n<0) return false;
    while(n%2==0){
    if(n==0 || n==2) return true;
    int m=n/2;
    n=m;
    }
    return false;
    }}大家看看符合不?
      

  10.   

    public class Test {
    public static void main(String args[]) {
    Integer num = 1024;
    System.out.println(Integer.toBinaryString(num).matches("10*"));
    }
    }
      

  11.   

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    public class Test {
    static BufferedReader br=null;

    public static void main(String[] args) {
    br=new BufferedReader(new InputStreamReader(System.in));
    System.out.println("请输入一个数:");
    int a;
    try {
    a = Integer.parseInt(br.readLine());
    if(new Test().func(a)==-1){
    System.out.println("不是2的阶次方数");
    }else{
    System.out.println("是2的"+new Test().func(a)+"方数");
    }
    } catch (NumberFormatException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }

    }
    public int func(int a){ 
    for(int i=0;i<100;i++) {
    if(Math.pow(2, i)==a) {
    return i;
    }
    }
    return -1;
    }
    }
      

  12.   

    //因为输入数字可能为floaw,double型,所以我要把传入参数定为String类型
    public boolean IsTest(String num) {
    //前提是判断是否为整数,因为只有整数才能,其他的都不行
    if (isNumeric(num)) {
    int i = Integer.parseInt(num);
    // 首先判断是1,0数字或为小于1的数字,如果是,就不进行一下判断直接返回false
    if (i == 0 || i == 1 || i < 1) {
    return false;
    } else {
    if (i % 2 == 0) {
    return true;
    } else {
    return false;
    }
    }
    }else
    {
    return false;
    }

    }
    //判断数字是否是整数
    public boolean isNumeric(String str) {
    java.util.regex.Pattern pattern = Pattern.compile("[0-9]*");
    java.util.regex.Matcher isNum = pattern.matcher(str.trim());
    if (!isNum.matches()) {
    return false;
    }
    return true;
    }
      

  13.   

    如果一个数是2的阶次方数,这么这个数的2进制最高位为1,其余几位为0,比这个数小1的数的2进制最高位为0,其余位则为1,因此这两个二进制数相与结果就为0,所心程序可以这样写:
    public class Main{ 
        public static void main(String[] args) { 
            for(int i=2;i <1000;i++){ 
                if((i&(i-1))==0){ 
                    System.out.println(i); 
                } 
            } 
        } 

      

  14.   

    相信很多人&、|、^、~之类的位操作符都遗忘了吧,我也是……当补课了……