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

问题描述 投票:0回答:2

下面我有一个名为'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());
    }
}
java intellij-idea binary hex decimal
2个回答
0
投票

此代码基于来自here的一些代码,但该链接似乎不再活跃。无论如何,从十六进制字符串你可以得到这样的int:

int hexToDecimal(String s){
  int result = 0;
  int digit = 0;
  for (int i = 0; i < s.length(); i++) {
    char c = s.charAt(i);
    if (c >= '0' && c <= '9')
       digit = c - '0';
    else 
      if (c >= 'A' && c <= 'F')
        digit = 10 + c - 'A';
      else 
        inputError(s);
    result = 16 * result + digit;
  }
  return result
}

0
投票

我稍微修改了你的代码。

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

更改:

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

湾打印后丢弃二进制值,因此无法重复使用。

更改:

  • 将hex到Binary的返回类型从void更改为String并返回计算的二进制值。
  • 为了能够返回一个字符串,我将十六进制/二进制的和平(半字节)添加到每个switch(case)子句中的String。(Stringbuilder可能比String更好 - 你可以另外改进它)
  • 在main中:另外收集名为“binaryValues”的arraylist中的所有返回的二进制值,以便将它们用于下一步。

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

所以我能够在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返回String - 如果你愿意,你可以在循环中打印它。

© www.soinside.com 2019 - 2024. All rights reserved.