I wrote this program for someone who wanted it without using of ToBinaryString and ToString methods. I wrote the app, but it doesn't work! If I do Dec2Bin, it gives me null! and if I do Bin2Dec it gives me String out of index: -1! Can someone help me fix it?
Code:
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;
}
}
This is the error I'm getting when using 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)
Before this, I have used int
type for variables, but I got String out of Index: -1
in the line I've used charAt. I've also used substr before that and I got the same error!
EDIT: If I use temp = arg.charAt(Integer.parseInt(String.valueOf(arg.length()-x-1)));
I will get this error:
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)
There is a problem with your for loop
inequality statements, namely:
In your dec2bin
method: for(i = maxpower+1; i <= 0; i--)
should be for(i = maxpower+1; i >= 0; i--)
because you will never enter the loop and you print the default value for out
which is null
.
In your bin2dec
method: for (x = 0; x <= length; x++)
should be for (x = 0; x < length; x++)
because temp = arg.charAt(arg.length()-x-1);
can be -1
at the end of your loop.
*After your updated question with the error stacktrace, use int
instead of long
for your variables or else you need casting to int
for charAt
to work.
Finally, I've managed to edit my code :)
Thanks to Konstantinos Chalkias I found out what I had to do :D
This is the final class (that works very good!):
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;
}
}
In final code, I used while
instead of for
.
I found much of this code in Java2Novice's Interview Programs . Many thanks to them for those codes.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.