java - 将十进制转换为二进制以及二进制转换为十进制时的 substr、整数和循环问题

标签 java substr

我为那些想要不使用 ToBinaryString 和 ToString 方法的人编写了这个程序。 我写了这个应用程序,但它不起作用! 如果我执行 Dec2Bin,它会给我 null!如果我执行 Bin2Dec 它会给我索引外的字符串:-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输入变量,但我得到 String out of Index: -1在我使用过 charAt 的行中。 我之前也使用过 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去工作。

关于java - 将十进制转换为二进制以及二进制转换为十进制时的 substr、整数和循环问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27768316/

相关文章:

java - 使用 isALive() 或连接方法时出错

java - 具有依赖关系的 Maven jar?

带有 utf-8 的 php substr() 函数在末尾留下 � 标记

bash - 如何拆分字符串取决于其他列中的模式(UNIX 环境)

c++ - 在字符串中查找字符时遇到问题

java - JVM 内存使用量超过操作系统报告的内存使用量

java - 我如何获得真正可用的分辨率

java - Hibernate 在单个事务中自动更新

r - 根据现有变量的前 7 个字符创建一个新变量

r - 获取 R 中的第一个非零数字,类似于 Mathematica