使用old-school方式将整数转换为二进制

时间:2017-03-07 14:21:24

标签: java binary

我知道使用System.out.println(Integer.toBinaryString(num));

在Java中实现这一点非常容易

但是,我想使用循环来做这个,我试过这个,但顺序是相反的。我该如何解决这个问题:

public class Main {

  public static void main(String[] args) {

    Scanner in = new Scanner(System.in);
    int num = in.nextInt();

    while (num >= 2) {

      System.out.print(num % 2);

      num = (int) num / 2;
    }

    System.out.println(num);
  }
}

例如;

输入num = 8

打印0001,但必须改为1000

5 个答案:

答案 0 :(得分:1)

使用String来存储结果:

@Url.Action( "Index", "UserGroupEdit")

答案 1 :(得分:1)

正如Brian建议的那样,将中间值存储在String中。

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int num = in.nextInt();
        String x = "";

        while (num >= 2) {
            x = x + Integer.valueOf(num % 2);

            num = (int) num / 2;
        }

        String newX = new StringBuilder(x).reverse().toString();

        System.out.print(num + newX);
    }
}

答案 2 :(得分:1)

如果你真的想要它 - 学校那么你可以递归地做到:

public static void main(String[] args) {
    try (Scanner in = new Scanner(System.in)) {
        int num = in.nextInt();
        System.out.println(getBinaryString(num));
    }
}

//Does not take care of negative values
private static String getBinaryString(int num) {
    if (num <= 2) {
        return "" + (num % 2);
    }
    return getBinaryString(num / 2) + (num % 2);
}

答案 3 :(得分:1)

以下代码并不是太认真,以下代码是真正的老式实现,它利用传统的位掩码和位移。它也适用于负数,因此产生与Integer.toBinaryString()相同的结果。通过使中间字符数组静态线程安全性进行交易以提高性能,因此请确保不要在多线程环境中使用它。当然,我们将在各个地方使用相同的常量值,无意义的标识符和混淆优化的其他方式,以确保 lamers不会立即理解正在发生的事情初学者看看代码应该是多么好看。请记住:更短的代码=更好的代码和更小的文件=更少的传输时间,因此在可能的情况下省略无用的空格和换行符。每行不要超过80个字符,这样您的矩阵打印机就可以轻松地在列表纸上打印出您的代码而不会有任何麻烦。

private static char[]a=new char[32];
public static String b(int c) {
    int d=32; do a[--d]=(char)(48+(c&1)); while ((c>>>=1)!=0);
    return new String(a,d,32-d);
}

结论:很高兴像Integer.toBinaryString()这样的东西可以在生产代码中使用。

答案 4 :(得分:0)

您可以提前计算位数并反向打印位。

这适用于任何给定的基础(2 - 9)。

import java.util.Scanner;

public class Main {
    public static final int BASE = 2;

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.print("Enter number: "); // Promp user

        int num = in.nextInt();
        int bits = (int) Math.floor(Math.log(num) / Math.log(BASE)); // Calculate min bits

        for (int bit = bits; bit >= 1; bit--) { // Loop in reverse
            int factor = (int) Math.pow(BASE, bit);
            System.out.print(num / factor);
            num = (int) num % factor;
        }

        System.out.println(num);
        in.close();
    }
}

支持任何基础/字母。

import java.util.Scanner;

public class Main {
    public static final int BASE = 16;
    public static final char[] ALPHABET = {
        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
        'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
        'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
        'U', 'V', 'W', 'X', 'Y', 'Z'
    };

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.print("Enter number: ");

        int num = in.nextInt();
        int bits = (int) Math.floor(Math.log(num) / Math.log(BASE)) + 1;

        if (bits <= 0) {
            System.out.println(0);
        }

        for (int bit = bits - 1; bit >= 0; bit--) {
            int factor = (int) Math.pow(BASE, bit);
            System.out.print(ALPHABET[num / factor]);
            num = (int) num % factor;
        }

        in.close();
    }
}

这是Viktor建议的自定义基本支持的递归实现。

import java.util.Scanner;

public class Main {
    public static final int BASE = 16;
    public static final char[] ALPHABET = {
        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
        'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
        'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
        'U', 'V', 'W', 'X', 'Y', 'Z'
    };

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.print("Enter number: "); // Prompt user
        System.out.println(integerToString(in.nextInt()));
        in.close();
    }

    public static String integerToString(int n) {
        return integerToString(n, BASE);
    }

    public static String integerToString(int n, int radix) {
        return integerToString(n, radix, ALPHABET);
    }

    public static String integerToString(int n, int radix, char[] alphabet) {
        return (n > radix ? integerToString(n / radix, radix, alphabet) : "") + ALPHABET[n % radix];
    }
}