从整数转换为二进制

3
有没有一种方法可以将整数转换为二进制数字,而不使用Integer.toBinaryString方法? 我试图找出转换算法,但没有成功。
我的任务是这样的:(https://open.kattis.com/problems/reversebinary)
插入一个整数并通过Scanner帮助进行转换为二进制。 反转二进制。 打印出新的整数。
例如,数字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个回答

3
首先,您应该使用正确的术语。您不是将int转换为二进制。int类型(以及所有数字类型)已经以二进制格式存储。当您将int转换为String或String转换为int时,您选择字符串表示使用的基数(例如十进制,二进制,八进制,十六进制等)。这决定了在字符串表示中出现的数字。现在,根据您的示例,您希望生成一个数字,其二进制表示形式是输入数字的反转。换句话说,您想要反转输入数字的位。
您当前的循环:
while (binary != 0) {          
    reverse = reverse * 10 + binary % 10;         
    binary = binary / 10;         
}

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

如果您想要输入数字的二进制表示的反向值,则应该乘以2并除以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

如果number11,则reverse将会是13,因为1011的反转是1101。这段代码将会打印出反转后数字的二进制表示(1101)和十进制表示(13)。

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));

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);

1

Integer.toBinaryString - 将整数参数作为二进制无符号整数返回其字符串表示。

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。

这正是我想的。我在Intellij / Eclipse中没有遇到错误,当我将代码放在这里时,就会出现NumberFormatException: https://open.kattis.com/problems/reversebinary/submit# - DMT82
啊,我把问题搞混了。 - JGCW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接