我正在练习Java,而这次我正在编写一个程序
1.将2个二进制数转换为十进制数
2.计算这2个十进制数的总和
3.以二进制和十进制显示结果
我知道我在代码中没有采用有效的方式,但这是故意的
(所以我只用一个项目就可以练习更多)
但是我的代码中存在一个问题,即当它要转换时
二进制到十进制
它总是将第一个数字显示为“3”,第二个数字显示为第二个数字
为“2”。
有人能告诉我我做错了什么吗?提前谢谢。
(我已经尝试在互联网上搜索答案,但我找不到它。
对不起,如果我因为一个愚蠢的错误而浪费你的时间。)
package binary2decimal2binary;
import java.util.Scanner;
import java.util.ArrayList;
public class Binary2Decimal2Binary {
private static long binary1;
private static long binary2;
private final static ArrayList POWERSOF2 = new ArrayList<Integer>();
private final static ArrayList<Integer> SEPARATED2 = new ArrayList<Integer>();
private static int temp1 = 0;
private static int result1 = 0;
private static int temp2 = 0;
private static int result2 = 0;
private final static ArrayList<Integer> SEPARATED1 = new ArrayList<Integer>();
static void binary2ArrayList(long binary1, long binary2){
String separating1 = String.valueOf(binary1);
System.out.println("Debugger 1 :" + separating1);
for(int i = 0; i < separating1.length(); i++) {
int j =(int) Character.digit(separating1.charAt(i), 10);
SEPARATED1.add(j);}
String separating2 = String.valueOf(binary2);
System.out.println("Debugger2 :" + separating2);
for(int x = 0; x < separating2.length(); x++) {
int y =(int) Character.digit(separating2.charAt(x), 10);
SEPARATED2.add(y);
}
Arraylist2Decimal();
}
static void Arraylist2Decimal(){
for(Integer intValue : SEPARATED1 ){
int i = 0;
temp1 = (int) SEPARATED1.get(i);
if(temp1 == 1){
result1 = (int) POWERSOF2.get(i) + result1;
}
i += 1;
System.out.println("Debugger 3:" + i);
}
for(Integer intValue: SEPARATED2){
int k = 0;
temp2 = (int) SEPARATED2.get(k);
if(temp2 == 1){
result2 = (int) POWERSOF2.get(k) + result2;
} k += 1;
System.out.println("Debugger 4:" + k);
}
};
public static void main(String[] args) {
POWERSOF2.add(1);
POWERSOF2.add(2);
POWERSOF2.add(4);
POWERSOF2.add(8);
POWERSOF2.add(16);
POWERSOF2.add(32);
POWERSOF2.add(64);
POWERSOF2.add(128);
POWERSOF2.add(256);
POWERSOF2.add(512);
POWERSOF2.add(1024);
POWERSOF2.add(2048);
POWERSOF2.add(4096);
POWERSOF2.add(8192);
POWERSOF2.add(16384);
POWERSOF2.add(32768);
Scanner scan = new Scanner(System.in);
System.out.println("Input first binary number.");
binary1 = scan.nextLong();
System.out.println("Input second binary number.");
binary2 = scan.nextLong();
scan.close();
binary2ArrayList(binary1,binary2);
System.out.println("First Number Converted:" + result1);
System.out.println("Second Number Converted:" + result2);
}
}
编辑:我添加了一些代码来检查我的循环发生了什么,
并且发生了一些奇怪的事情
INPUT:
101个
10个
OUTPUT:
调试器1:101
Debugger2:10
调试器3:1
调试器3:1
调试器3:1
调试器4:1
调试器4:1
转换的第一个数字:3
转换的第二个数字:2
即使我添加了
i + = 1;和
k + = 1;在循环中,值永远不会是
往上走。请帮帮我。
答案 0 :(得分:0)
这里实际上有很多东西需要一些改进。
从Java 1.5开始,有Generics。尽可能使用 (即ArrayList<Integer>
代替原始类型 ArrayList
)。
在定义变量时使用接口而不是实现(即List<Integer> list = new ArrayList<Integer>();
而不是ArrayList<Integer> list = new ArrayList<Integer>();
)。
不要过度使用static
关键字。利用类和封装等OOP概念。从长远来看,它可以防止不必要的副作用。
尝试将private
和final
添加到尽可能多的字段中。它可以防止重新分配和其他类在与它们无关时访问这些值。
您需要改进循环:
for(Type element : Iterable)
已经为您提供了该可迭代中的元素。在该循环中调用separated1.get(i)
没有意义(特别是因为i
总是0
),因为单个元素已经可以通过element
访问。
总而言之,您的代码看起来应该是这样的:
....
private final List<Integer> separated2 = new ArrayList<Integer>();
....
for(Integer intValue : separated2) {
// your logic using intValue
....
}
编辑:传统for
循环的等效示例如下所示:
private final List<Integer> separated2 = new ArrayList<Integer>();
....
for(int i = 0; i < separated2.size(); i++) {
Integer intValue = separated2.get(i);
// your logic using intValue
....
}
答案 1 :(得分:0)
要将二进制字符串转换为整数使用:
Integer.parseInt("binaryString",2);
这是工作代码。
public static void main(String[] args) throws ParseException {
Scanner scanner = new Scanner(System.in);
System.out.println("Input first binary number.");
String firstBinary = scanner.next("[0-1]+");
System.out.println("Input second binary number.");
String secondBinary = scanner.next("[0-1]+");
int int1 = convertToInt(firstBinary);
int int2 = convertToInt(secondBinary);
int sum = calculateSum(int1, int2);
display(firstBinary, secondBinary, int1, int2);
System.out.println("sum is " + sum);
}
public static void display(String binary1, String binary2, int arg1, int arg2) {
System.out.printf("%1s10 = %2d5\n%3s10 = %4d5", binary1, arg1, binary2, arg2);
}
public static int convertToInt(String binary) {
return Integer.parseInt(binary, 2);
}
public static int calculateSum(int arg1, int arg2) {
return arg1 + arg2;
}
此程序首先要求您输入两个二进制文件。它将它们转换为Integer并计算它们的总和。 Finall它会将结果显示给控制台。