如何不使用解析或自动转换将十六进制数转换为二进制数

时间:2019-02-17 07:17:28

标签: java intellij-idea binary hex decimal

下面,我有一个名为 'hextoBinary' 的方法,该方法通过void类型返回十六进制到二进制的转换。

为了使我继续执行程序,我需要将十六进制转换为返回并返回int的二进制方法,以便可以使用我的 'hextoDecimal'将二进制int转换为十进制方法。

任何人都可以帮助我或指导我采取什么方法,我已经坚持了一段时间。我仅限于手动执行此操作,而不是使用解析或Java自动转换。

import java.io.*;
import java.util.Scanner;
import java.util.ArrayList;

public class Main
{
    static void hexToBinary(char hexdec[])
    {
        for (char c: hexdec)
        {
            switch (c)
            {
                case '0':
                    System.out.print("0000");
                    break;
                case '1':
                    System.out.print("0001");
                    break;
                case '2':
                    System.out.print("0010");
                    break;
                case '3':
                    System.out.print("0011");
                    break;
                case '4':
                    System.out.print("0100");
                    break;
                case '5':
                    System.out.print("0101");
                    break;
                case '6':
                    System.out.print("0110");
                    break;
                case '7':
                    System.out.print("0111");
                    break;
                case '8':
                    System.out.print("1000");
                    break;
                case '9':
                    System.out.print("1001");
                    break;
                case 'A':
                    System.out.print("1010");
                    break;
                case 'B':
                    System.out.print("1011");
                    break;
                case 'C':
                    System.out.print("1100");
                    break;
                case 'D':
                    System.out.print("1101");
                    break;
                case 'E':
                    System.out.print("1110");
                    break;
                case 'F':
                    System.out.print("1111");
                    break;
                default:
                    System.out.print("\nInvalid hexadecimal digit " + hexdec[c]);
            }
        }
    }

    public static int hextoDecimal(int n)
    {
        int decimal = 0, p = 0;
        while(n != 0)
        {
            decimal += ((n % 10) * Math.pow(2,p));
            n = n / 10;
            p++;
        }
        return decimal;
    }

    public static void main(String[] args) throws IOException
    {
        Scanner sc = new Scanner(new File("RAMerrors8x4c"));
        ArrayList<String> hexValues = new ArrayList<>();

        while(sc.hasNext())
        {
            hexValues.add(sc.nextLine());
        }

        hexToBinary(hexValues.get(0).toCharArray());
    }
}

2 个答案:

答案 0 :(得分:0)

此代码基于来自here的代码,但该链接似乎不再有效。无论如何,您可以从十六进制字符串中获得如下所示的int值:

-webkit-overflow-scrolling: touch;

答案 1 :(得分:0)

我对您的代码做了一些修改。

a。在您的代码中仅打印了第一个十六进制。

更改:

  • 为每个十六进制字符串调用hexToBinary。

b。该二进制值在打印后被丢弃,因此无法重复使用。

更改:

  • 将hexToBinary的返回类型从void更改为String,并返回计算出的二进制值。

  • 为了能够返回字符串,我在每个switch(case)子句中都将十六进制/二进制数的和(小节)添加到字符串中。(Stringbuilder可能比String更好-您可以进一步改进

  • 主要是:另外,将所有返回的二进制值收集在一个称为“ binaryValues”的数组列表中,以使其用于下一步。

通过上面的(小的)更改,我现在拥有了已经计算出的所有二进制值。

因此,我能够在binaryToDecimal方法中简单地使用它们,该方法只是对按其位置加权的二进制值求和。

为什么不再做一次?因为您需要将A-F转换为您的hexToBinary已经完成的数字。因此,存储值可以节省您再次执行该步骤的步骤。我有种感觉,就是您的老师将这样的任务结合在一起时想到的。

结果代码为:

import java.io.*;
import java.util.Scanner;
import java.util.ArrayList;

public class Main
{
     static String hexToBinary(char hexdec[]) {
            String hex = "";
            for (char c : hexdec) {
                switch (c) {
                    case '0':
                        System.out.print("0000");
                        hex += "0000";
                        break;
                    case '1':
                        System.out.print("0001");
                        hex += "0001";
                        break;
                    case '2':
                        System.out.print("0010");
                        hex += "0010";
                        break;
                    case '3':
                        System.out.print("0011");
                        hex += "0011";
                        break;
                    case '4':
                        System.out.print("0100");
                        hex += "0100";
                        break;
                    case '5':
                        System.out.print("0101");
                        hex += "0101";
                        break;
                    case '6':
                        System.out.print("0110");
                        hex += "0110";
                        break;
                    case '7':
                        System.out.print("0111");
                        hex += "0111";
                        break;
                    case '8':
                        System.out.print("1000");
                        hex += "1000";
                        break;
                    case '9':
                        System.out.print("1001");
                        hex += "1001";
                        break;
                    case 'A':
                        System.out.print("1010");
                        hex += "1110";
                        break;
                    case 'B':
                        System.out.print("1011");
                        hex += "1111";
                        break;
                    case 'C':
                        System.out.print("1100");
                        hex += "1100";
                        break;
                    case 'D':
                        System.out.print("1101");
                        hex += "1110";
                        break;
                    case 'E':
                        System.out.print("1110");
                        hex += "1110";
                        break;
                    case 'F':
                        hex += "1111";
                        System.out.print("1111");
                        break;
                    default:
                        System.out.print("\nInvalid hexadecimal digit " + hexdec[c]);
                }
            }
            System.out.println();
            return hex;
        }

        public static int binaryToDecimal(String binary) {
            int decimal = 0;
            for (int i = 1; i < binary.length()-1; i++) {
                    decimal += Math.pow(2, i-1) * (binary.charAt(binary.length()-i) - '0');
            }
            return decimal;
        }

        public static void main(String[] args) throws IOException {
            Scanner sc = new Scanner(new File("RAMerrors8x4c"));
            ArrayList<String> hexValues = new ArrayList<>();
            ArrayList<String> binaryValues = new ArrayList<>();
            while (sc.hasNext()) {
                hexValues.add(sc.nextLine());
            }
            for (String hex : hexValues) {
                String binary = hexToBinary(hex.toCharArray());
                binaryValues.add(binary);
                System.out.println(binary);
            }
            for (String binary : binaryValues) {
                int decimal = binaryToDecimal(binary);
                System.out.println(decimal);
            }
        }
    }
}

除了使用Stringbuilder外,另一个想法可能是对main中的所有二进制值进行打印。 hexToBinary返回字符串-如果需要,您可以在循环中打印它。