简体   繁体   中英

iProblems with substr, integers and loops in converting decimal to binary and binary to decimal

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM