将十进制转换为二进制和将二进制转换为十进制时,substr、整数和循环的问题
iProblems with substr, integers and loops in converting decimal to binary and binary to decimal
我为不使用 ToBinaryString 和 ToString 方法的人编写了这个程序。
我编写了该应用程序,但它不起作用!
如果我做 Dec2Bin,它会给我 null!如果我执行 Bin2Dec,它会给我 String out of index: -1!
有人可以帮我解决吗?
代码:
package decimalBinary;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class DecBin {
public static void main(String[] args) throws NumberFormatException, IOException {
int conargs1,conargs2;
// conargs1 is input
// conargs2 is mode, if = 1 then dec2bin, if = 2 then bin2dec
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Enter number: ");
conargs1=Integer.parseInt(br.readLine());
System.out.println("Enter mode: ");
conargs2 = Integer.parseInt(br.readLine());
System.out.println(conargs2==1 ? "Dec2Bin" : (conargs2==2 ? "Bin2Dec" : "none"));
if (args.length == 2){ // TO BINARY
if(conargs2==1){
System.out.println(DecBin.dec2bin(String.valueOf(conargs1)));
}else if (conargs2==2){ // TO DECIMAL
System.out.println(DecBin.bin2dec(String.valueOf(conargs1)));
}
System.exit(0);
}
}
public static String dec2bin(String arg){
String out = null;
String tmp;
long i, x;
int maxpower = 30;
x = Long.parseLong(arg);
if (x == 0){
return "0";
}else if (x > 0){ // positive decimals
if (x > Math.pow(2, maxpower)) {
return "should be no larger than " + String.valueOf(2 ^ maxpower);
}
out = "";
for(i = maxpower+1; i <= 0; i--){
if (x % (Math.pow(2, i))==0){
out = out + "1";
}else{
out = out + "0";
}
}
}else{ // negative decimals
x = -x;
x = Math.abs(x);
if (x > Math.pow(2, maxpower)) {
return "should be no larger than " + String.valueOf(2 ^ maxpower);
}
out = "";
for(i = maxpower+1; i <= 0; i--){ // Inverted Binary
if (x % (Math.pow(2, i))==0){
out = out + "0";
}else{
out = out + "1";
}
}
x = DecBin.bin2dec(out)+1;
out= "";
for(i = maxpower+1; i <= 0; i--){
if (x % (Math.pow(2, i))==0){
out = out + "1";
}else{
out = out + "0";
}
}
}
return out;
}
public static long bin2dec(String arg){
// If it was a positive number.
long dec = 0; // initializing decimal number
long length = arg.length(); // length of our binary string
char temp;
//long charplace;
long lengthofchar = 1;
long x = 0;
if (arg.length() <= 0){return 0;}
for (x = 0; x <= length; x++) {
// charplace = 0;
// charplace = -x;
// charplace += -1;
// charplace += arg.length();
// charplace = Long.sum(charplace, 5);
// charplace -= lengthofchar;
// charplace--;
temp = arg.charAt(arg.length()-x-1);
// length = length - 1;
if (temp != '0') {
dec += Math.pow(2 , x - 1);
}
}
return dec;
}
}
这是我在使用 bin2dec 时遇到的错误:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The method charAt(int) in the type String is not applicable for the arguments (long)
at decimalBinary.DecBin.bin2dec(DecBin.java:98)
at decimalBinary.DecBin.main(DecBin.java:22)
在此之前,我为变量使用了 int
类型,但在我使用 charAt 的行中得到了 String out of Index: -1
。
之前我也用过substr,我也遇到了同样的错误!
编辑:
如果我使用 temp = arg.charAt(Integer.parseInt(String.valueOf(arg.length()-x-1)));
我会得到这个错误:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.charAt(Unknown Source)
at decimalBinary.DecBin.bin2dec(DecBin.java:98)
at decimalBinary.DecBin.main(DecBin.java:22)
你的 for loop
不等式语句有问题,即:
在您的 dec2bin
方法中:for(i = maxpower+1; i <= 0; i--)
应该是 for(i = maxpower+1; i >= 0; i--)
因为您永远不会进入循环并且您打印 out
的默认值 null
.
在您的 bin2dec
方法中:for (x = 0; x <= length; x++)
应该是 for (x = 0; x < length; x++)
因为 temp = arg.charAt(arg.length()-x-1);
在循环结束时可以是 -1
。
*在使用错误堆栈跟踪更新问题后,使用 int
而不是 long
作为变量,否则您需要转换为 int
才能使 charAt
工作.
最后,我成功地编辑了我的代码:)
感谢 Konstantinos Chalkias 我找到了我必须做的事情 :D
这是最后的 class(效果很好!):
package decimalBinary;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class DecBin {
public static void main(String[] args) throws NumberFormatException, IOException {
int conargs1,conargs2;
// conargs1 is input
// conargs2 is mode, if = 1 then dec2bin, if = 2 then bin2dec
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Enter number: ");
conargs1=Integer.parseInt(br.readLine());
System.out.println("Enter mode: ");
conargs2 = Integer.parseInt(br.readLine());
System.out.println(conargs2==1 ? "Dec2Bin" : (conargs2==2 ? "Bin2Dec" : "none"));
if (args.length == 2){ // TO BINARY
if(conargs2==1){
System.out.println(DecBin.dec2bin(String.valueOf(conargs1)));
}else if (conargs2==2){ // TO DECIMAL
System.out.println(DecBin.bin2dec(String.valueOf(conargs1)));
}
System.exit(0);
}
}
public static String dec2bin(String arg){
String out = null;
String tmp;
long i, x;
int maxpower = 30;
x = Integer.parseInt(arg);
if (x == 0){
return "0";
}else if (x > 0){ // positive decimals
if (x > Math.pow(2, maxpower)) {
return "should be no larger than " + String.valueOf(2 ^ maxpower);
}
out = "";
int binary[] = new int[30];
int index = 0;
while(x > 0){
binary[index++] = (int) (x % 2);
x = x/2;
}
for(i = index-1;i >= 0;i--){
out = out+binary[(int) i];
}
}else{ // negative decimals
// x = -x;
x = Math.abs(x); // convert positive of decimal to binary
if (x > Math.pow(2, maxpower)) {
return "should be no larger than " + String.valueOf(2 ^ maxpower);
}
long xBinaryPositive;
xBinaryPositive = Long.parseLong(DecBin.dec2bin(String.valueOf(x)));
String xBinaryInverted;
out = "";
xBinaryInverted = String.valueOf(xBinaryPositive).replace('0', '2').replace('1', '0').replace('2', '1');
long xBinaryInvertedIntVal;
xBinaryInvertedIntVal = DecBin.bin2dec(xBinaryInverted);
out = DecBin.dec2bin(String.valueOf(xBinaryInvertedIntVal+1));
}
return out;
}
public static long bin2dec(String binaryInput){
long binary = Long.parseLong(binaryInput);
long decimal = 0;
long power = 0;
while(true){
if(binary == 0){
break;
} else {
long tmp = binary % 10;
decimal += tmp * Math.pow(2, power);
binary = binary/10;
power++;
}
}
return decimal;
}
}
在最终代码中,我使用 while
而不是 for
。
我在 Java2Novice's Interview Programs 中找到了大部分代码。非常感谢他们提供这些代码。
我为不使用 ToBinaryString 和 ToString 方法的人编写了这个程序。 我编写了该应用程序,但它不起作用! 如果我做 Dec2Bin,它会给我 null!如果我执行 Bin2Dec,它会给我 String out of index: -1! 有人可以帮我解决吗?
代码:
package decimalBinary;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class DecBin {
public static void main(String[] args) throws NumberFormatException, IOException {
int conargs1,conargs2;
// conargs1 is input
// conargs2 is mode, if = 1 then dec2bin, if = 2 then bin2dec
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Enter number: ");
conargs1=Integer.parseInt(br.readLine());
System.out.println("Enter mode: ");
conargs2 = Integer.parseInt(br.readLine());
System.out.println(conargs2==1 ? "Dec2Bin" : (conargs2==2 ? "Bin2Dec" : "none"));
if (args.length == 2){ // TO BINARY
if(conargs2==1){
System.out.println(DecBin.dec2bin(String.valueOf(conargs1)));
}else if (conargs2==2){ // TO DECIMAL
System.out.println(DecBin.bin2dec(String.valueOf(conargs1)));
}
System.exit(0);
}
}
public static String dec2bin(String arg){
String out = null;
String tmp;
long i, x;
int maxpower = 30;
x = Long.parseLong(arg);
if (x == 0){
return "0";
}else if (x > 0){ // positive decimals
if (x > Math.pow(2, maxpower)) {
return "should be no larger than " + String.valueOf(2 ^ maxpower);
}
out = "";
for(i = maxpower+1; i <= 0; i--){
if (x % (Math.pow(2, i))==0){
out = out + "1";
}else{
out = out + "0";
}
}
}else{ // negative decimals
x = -x;
x = Math.abs(x);
if (x > Math.pow(2, maxpower)) {
return "should be no larger than " + String.valueOf(2 ^ maxpower);
}
out = "";
for(i = maxpower+1; i <= 0; i--){ // Inverted Binary
if (x % (Math.pow(2, i))==0){
out = out + "0";
}else{
out = out + "1";
}
}
x = DecBin.bin2dec(out)+1;
out= "";
for(i = maxpower+1; i <= 0; i--){
if (x % (Math.pow(2, i))==0){
out = out + "1";
}else{
out = out + "0";
}
}
}
return out;
}
public static long bin2dec(String arg){
// If it was a positive number.
long dec = 0; // initializing decimal number
long length = arg.length(); // length of our binary string
char temp;
//long charplace;
long lengthofchar = 1;
long x = 0;
if (arg.length() <= 0){return 0;}
for (x = 0; x <= length; x++) {
// charplace = 0;
// charplace = -x;
// charplace += -1;
// charplace += arg.length();
// charplace = Long.sum(charplace, 5);
// charplace -= lengthofchar;
// charplace--;
temp = arg.charAt(arg.length()-x-1);
// length = length - 1;
if (temp != '0') {
dec += Math.pow(2 , x - 1);
}
}
return dec;
}
}
这是我在使用 bin2dec 时遇到的错误:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The method charAt(int) in the type String is not applicable for the arguments (long)
at decimalBinary.DecBin.bin2dec(DecBin.java:98)
at decimalBinary.DecBin.main(DecBin.java:22)
在此之前,我为变量使用了 int
类型,但在我使用 charAt 的行中得到了 String out of Index: -1
。
之前我也用过substr,我也遇到了同样的错误!
编辑:
如果我使用 temp = arg.charAt(Integer.parseInt(String.valueOf(arg.length()-x-1)));
我会得到这个错误:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.charAt(Unknown Source)
at decimalBinary.DecBin.bin2dec(DecBin.java:98)
at decimalBinary.DecBin.main(DecBin.java:22)
你的 for loop
不等式语句有问题,即:
在您的 dec2bin
方法中:for(i = maxpower+1; i <= 0; i--)
应该是 for(i = maxpower+1; i >= 0; i--)
因为您永远不会进入循环并且您打印 out
的默认值 null
.
在您的 bin2dec
方法中:for (x = 0; x <= length; x++)
应该是 for (x = 0; x < length; x++)
因为 temp = arg.charAt(arg.length()-x-1);
在循环结束时可以是 -1
。
*在使用错误堆栈跟踪更新问题后,使用 int
而不是 long
作为变量,否则您需要转换为 int
才能使 charAt
工作.
最后,我成功地编辑了我的代码:)
感谢 Konstantinos Chalkias 我找到了我必须做的事情 :D
这是最后的 class(效果很好!):
package decimalBinary;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class DecBin {
public static void main(String[] args) throws NumberFormatException, IOException {
int conargs1,conargs2;
// conargs1 is input
// conargs2 is mode, if = 1 then dec2bin, if = 2 then bin2dec
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Enter number: ");
conargs1=Integer.parseInt(br.readLine());
System.out.println("Enter mode: ");
conargs2 = Integer.parseInt(br.readLine());
System.out.println(conargs2==1 ? "Dec2Bin" : (conargs2==2 ? "Bin2Dec" : "none"));
if (args.length == 2){ // TO BINARY
if(conargs2==1){
System.out.println(DecBin.dec2bin(String.valueOf(conargs1)));
}else if (conargs2==2){ // TO DECIMAL
System.out.println(DecBin.bin2dec(String.valueOf(conargs1)));
}
System.exit(0);
}
}
public static String dec2bin(String arg){
String out = null;
String tmp;
long i, x;
int maxpower = 30;
x = Integer.parseInt(arg);
if (x == 0){
return "0";
}else if (x > 0){ // positive decimals
if (x > Math.pow(2, maxpower)) {
return "should be no larger than " + String.valueOf(2 ^ maxpower);
}
out = "";
int binary[] = new int[30];
int index = 0;
while(x > 0){
binary[index++] = (int) (x % 2);
x = x/2;
}
for(i = index-1;i >= 0;i--){
out = out+binary[(int) i];
}
}else{ // negative decimals
// x = -x;
x = Math.abs(x); // convert positive of decimal to binary
if (x > Math.pow(2, maxpower)) {
return "should be no larger than " + String.valueOf(2 ^ maxpower);
}
long xBinaryPositive;
xBinaryPositive = Long.parseLong(DecBin.dec2bin(String.valueOf(x)));
String xBinaryInverted;
out = "";
xBinaryInverted = String.valueOf(xBinaryPositive).replace('0', '2').replace('1', '0').replace('2', '1');
long xBinaryInvertedIntVal;
xBinaryInvertedIntVal = DecBin.bin2dec(xBinaryInverted);
out = DecBin.dec2bin(String.valueOf(xBinaryInvertedIntVal+1));
}
return out;
}
public static long bin2dec(String binaryInput){
long binary = Long.parseLong(binaryInput);
long decimal = 0;
long power = 0;
while(true){
if(binary == 0){
break;
} else {
long tmp = binary % 10;
decimal += tmp * Math.pow(2, power);
binary = binary/10;
power++;
}
}
return decimal;
}
}
在最终代码中,我使用 while
而不是 for
。
我在 Java2Novice's Interview Programs 中找到了大部分代码。非常感谢他们提供这些代码。