问题描述
我试图创建一个代码,用Java取一个整数并以二进制形式输出。问题似乎是二进制文件正在向后打印。例如,6
应该输出为011
,但输出为110
。
import java.util.Scanner;
public class LabProgram {
public static void main(String[] args) {
int userNum;
Scanner in =new Scanner(System. in );
userNum = in.nextInt();
binary(userNum);
System.out.print("\n");
}
private static void binary(int userNum) {
int remainder;
while (userNum <= 1) {
System.out.print(userNum);
return;
}
remainder = userNum % 2;
binary(userNum >> 1);
System.out.print(remainder);
}
}
我尝试合并一个推入堆栈,以将其余部分推入一个堆栈中,以便稍后再拉入,但无法完全将其降落。
private static void reverse(int userNum) {
String backwards;
while (userNum >= 0) {
backwards.push(int userNum);
System.out.println(backwards);
return;
}
}
这是课堂作业的一部分,要求以下内容。
As long as x is greater than 0
Output x % 2 (remainder is either 0 or 1)
x = x / 2
注意:以上算法以相反的顺序输出0和1。
例如:如果输入是:
6
输出为:
011
6
的二进制形式是110
;算法会反向输出位。
这些是程序应用的测试和我的结果。
输入6
您的输出binary is:110
预期输出011
输入19
您的输出10011
预期输出11001
输入255
您的输出11111111
预期输出11111111
对此有任何帮助或指导,我将不胜感激。
解决方法
根据要求,不考虑负数
import java.util.Scanner;
public class LabProgram {
public static void main(String[] args) {
int userNum;
Scanner scnr = new Scanner(System.in);
userNum = scnr.nextInt();
while(userNum > 0){
System.out.print(userNum % 2);
userNum = userNum / 2;
}
System.out.print("\n");
}
}
,
首先使用预定义方法,然后再使用自定义方法。
public class IntToBinary {
public static void main(String[] args) {
int decimalNumber = 10;
System.out.println(Integer.toBinaryString(decimalNumber));
System.out.println(convertBinary(10));
}
public static String convertBinary(int num) {
StringBuilder sb = new StringBuilder();
int binary[] = new int[40];
int index = 0;
while (num > 0) {
binary[index++] = num % 2;
num = num / 2;
}
for (int i = index - 1; i >= 0; i--) {
sb.append(binary[i]);
}
return sb.toString();
}
}
,
您的程序似乎可以正常工作。但是,它不处理负数,负数具有自己的唯一二进制表示形式,称为two's complement。您可以执行以下操作来容纳:
private static void binary(int userNum) {
int remainder;
// while (userNum <= 1) {
// System.out.print(userNum);
// return;
// }
if (userNum == 0) {
return;
}
// simply mask off the bit instead of dividing by two
remainder = userNum & 1;
// and shift right thru the sign bit
binary(userNum >>> 1);
System.out.print(remainder);
}
}
binary(-6));
打印
11111111111111111111111111111010
这些按正确顺序打印的原因是因为您的例程是递归的。通过递归过程打印存储在堆栈中的值是一种自然的行为。