Как я могу преобразовать шестнадцатеричное число в двоичное без разбора или автоматического преобразования - PullRequest
0 голосов
/ 17 февраля 2019

Ниже у меня есть метод с именем 'hextoBinary' , который возвращает шестнадцатеричное в двоичное преобразование через тип void.

Чтобы продолжить работу с моей программой, мне нужно преобразование из шестнадцатеричного в двоичный метод, который возвращает значение типа int, чтобы я мог преобразовать этот двоичный тип int в десятичное число с моим 'hextoDecimal' метод.

Кто-нибудь может мне помочь или подсказать, какой подход выбрать, я застрял на этом некоторое время.я ограничен в том, чтобы делать это вручную, вместо того чтобы использовать автоматические преобразования синтаксического анализа или 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 голосов
/ 17 февраля 2019

Я немного изменил ваш код.

a.В вашем коде был напечатан только первый гекс.

Изменение:

  • вызовите hexToBinary для каждой шестнадцатеричной строки.

b.двоичное значение было отброшено после печати, поэтому его нельзя было использовать повторно.

Изменение:

  • Изменен тип возвращаемого значения hexToBinary с void на String и возвращено вычисленное двоичное значение.

  • Чтобы иметь возможность вернуть строку, я добавляю миры (кусочки) шестнадцатеричного / двоичного кода в строку в каждом предложении switch (case). (Stringbuilder может быть лучше, чемa String - вы можете дополнительно улучшить это)

  • в основном: дополнительно собрать все возвращенные двоичные значения в массив, называемый «binaryValues», чтобы иметь их для следующего шага.

С вышеуказанными (небольшими) изменениями у меня теперь есть все двоичные значения, которые уже были вычислены.

Так что я могу просто использовать их в методе binaryToDecimal, которыйпросто суммирует двоичные значения, взвешенные по их положению.

Почему бы не сделать это снова?Потому что вам нужно конвертировать AF в числа, что уже сделал ваш 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, может возникнуть другая идея.сделать всю печать двоичных значений в основном.HexToBinary возвращает строку - так что вы можете напечатать ее в цикле - если хотите.

0 голосов
/ 17 февраля 2019

Этот код основан на том, что пришло из здесь , но эта ссылка больше не активна.В любом случае, из шестнадцатеричной строки вы можете получить значение типа 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...