从int到二进制的转换

时间:2015-12-15 10:11:53

标签: java algorithm java.util.scanner

有没有办法在不使用Integer.toBinaryString方法的情况下将int转换为二进制数? 我试图找出转换的算法,但没有任何运气。

我的任务是:(https://open.kattis.com/problems/reversebinary

  

在Scanner的帮助下插入Int   将Int转换为二进制   反转二进制文件   打印出新的Int。

例如,数字11是二进制的1011 现在反转二进制数1011,你得到1101(这是数字13)
并打印出13。

这就是我所得到的,但我仍然使用Integer.toBinaryString方法获得NumberFormatException

int reverse = 0;          
int number, binary;        

Scanner scn = new Scanner(System.in);          
number = scn.nextInt();         
String b = Integer.toString(number, 2);         
binary = Integer.parseInt(b);          

while (binary != 0) {          
    reverse = reverse * 10 + binary % 10;         
    binary = binary / 10;         

}
int newNumber = Integer.parseInt(String.valueOf(reverse), 2);        
System.out.println(newNumber);        

}
}

4 个答案:

答案 0 :(得分:3)

首先,您应该使用正确的术语。您没有将int转换为二进制文件。 int类型(以及所有数字类型)已经以二进制格式存储。将int转换为String或将String转换为int时,可以选择String表示使用的基数(例如十进制,二进制,八进制,十六进制等)。这确定了String表示中出现的数字。现在,根据您的示例,您要做的是生成一个数字,其二进制表示形式与输入数字相反。换句话说,您想要反转输入数字的位。

您当前的循环:

while (binary != 0) {          
    reverse = reverse * 10 + binary % 10;         
    binary = binary / 10;         
}

计算binary的十进制(基数10)数字并创建一个整数,其值是这些数字按相反顺序排列时的值。

如果你想要输入数字的二进制表示的反转,你应该乘以并除以2,以获得输入数字的二进制数字(也称为位)并反转它们:

while (number != 0) {     
    System.out.print (number % 2); // prints a binary digit (i.e. 0 or 1)    
    reverse = reverse * 2 + number % 2;         
    number = number / 2;         
}
System.out.println();
System.out.println(reverse); // prints the decimal representation of the reversed number

如果number11reverse将为13,因为1011的反面为1101。此代码将打印反转数字(1101)和十进制表示(13)的二进制表示。

答案 1 :(得分:1)

不是将二进制数作为数字反转,而是在它仍为字符串new StringBuilder(b).reverse().toString()时将其反转。然后将它从基数2转换回int,你就完成了。

所以整个代码都是:

    final Scanner scn = new Scanner(System.in);
    final int number = scn.nextInt();
    String b = Integer.toString(number, 2);
    b = new StringBuilder(b).reverse().toString();
    System.out.println(Integer.parseInt(b.toString(), 2));

答案 2 :(得分:1)

对于这个问题,最聪明的解决方案是移位。我写了一个例子并做了一点解释。

    int number, reverse = 0;
    Scanner scn = new Scanner(System.in);
    number = scn.nextInt();

    while (number > 0)
    {
        // shift all bits to the left
        reverse = reverse << 1;
        // extract the last bit of the number
        int bit = number & 1;
        // add the last bit to the reverse version
        reverse |= bit;
        // shift alle bits to the right
        number = number >> 1;
    }
    System.out.println(reverse);

答案 3 :(得分:1)

Integer.toBinaryString - 返回整数参数的字符串表示形式,作为基数为2的无符号整数。

String toString(int i, int radix) - 返回由第二个参数

指定的基数中第一个参数的字符串表示形式
public static void main(String[] args) {

        int reverse = 0;          
        int number, binary;        

        Scanner scn = new Scanner(System.in);          
        number = scn.nextInt();         
        String b = Integer.toBinaryString(number);     
        binary = Integer.parseInt(b);          

        while (binary != 0) {          
            reverse = reverse * 10 + binary % 10;         
            binary = binary / 10;         

        }
        int newNumber = Integer.parseInt(String.valueOf(reverse), 2);        
        System.out.println(newNumber); 

    }

事实上无论你使用什么都不能给出错误。上面的代码完美编译没有错误。
提供11,完美地给出了13。