Десятичное в шестнадцатеричное преобразование в Java

У меня есть домашнее задание, где мне нужно сделать трехстороннее преобразование между десятичным, двоичным и шестнадцатеричным. Функция, с которой мне нужна помощь, - это преобразование десятичного числа в шестнадцатеричное. Я почти не понимаю шестнадцатеричное, тем не менее, как преобразовать десятичное в шестнадцатеричное. Мне нужна функция, которая принимаетint dec и возвращаетString hex, К сожалению я неУ меня нет черновика этой функции, яЯ полностью потерян. Все, что у меня есть, это.

  public static String decToHex(int dec)
  {
    String hex = "";


    return hex;
  }

Тоже могуЧтобы использовать эти готовые функции, такие как Integer.toHexString () или что-то еще, мне нужно на самом деле сделать алгоритм, или я бы не сталЯ ничему не научился. "

 flyingpretzels20 нояб. 2012 г., 02:16
У меня минимальное понимание. Я'Вы посмотрели некоторые обучающие видео на YouTube и поняли основы: например, A представляет 10 и так далее, пока F не станет 16, и вы начнете новый набор. Это 0x0 и 0xA, не знаю. Я'я просто второкурсник в средней школе, и у нас нетдаже официально не узнал о гексах.
 Christian Trimble20 нояб. 2012 г., 02:25
Это основная проблема конверсии. Возможно, хорошим местом для начала была бы таблица ASCII -asciitable.com
 assafmo20 нояб. 2012 г., 02:10
Вы можете найти алгоритмы в Интернете. Они очень просты. :-)
 Hot Licks20 нояб. 2012 г., 02:22
Там'Ничего особенного в том, что ABCDEF составляет 10,11,12,13,14,15 - этоЭто всего лишь наиболее очевидное назначение символов для 16 цифр. Представьте себе, если бы у нас было только 8 пальцев и только цифры 0-7. Тогда мы можем представить десятичное число с символом A для 8 и B для 9. Или мы можем представить hex с символами[email protected]#$%^ вместо персонажей ABCDEF - тамНичего особенного / священного в выборе.
 flyingpretzels20 нояб. 2012 г., 02:10
Да, я понимаю. Однако я'я сидел здесь и царапал мне голову, работая над этим. Если бы я нея не мог понять, что делать, я бы непришел сюда в StackOverflow.
 Terrell Plotzki20 нояб. 2012 г., 02:12
У вас есть понимание шестнадцатеричного подсчета? Как и двоичный счет, за исключением того, что вместо двух наборов чисел вы используете 16. 0 = 0x0 1 = 0x1 ... 9 = 0x9 10 = 0xA 11 = 0xB ... 15 = 0XF 16 = 0X11 ...
 flyingpretzels20 нояб. 2012 г., 02:45
Я понял! То, что вы только что сказали, имело смысл для меня конвертировать в любую базу, и я объединил это с массивом возможных цифр, как у kol здесь, и это сработало! И я на самом деле понимаю! Большое спасибо!
 Hot Licks20 нояб. 2012 г., 02:38
Учитесь по модулю деления -% оператор. Многократно разделить (целое) число на основание N и взять оставшуюся часть (результат% деление) как цифра, уменьшая при этом/ разделение. Это даст вам цифры номера в базе N справа налево. Например, 27 десятичное число - это гекс 0x1B. Ну действуй27 % 16 и ты получаешь 11. Делай27 / 16 и вы получаете 1. Повторите с1 % 16 дает вам 1, и1 / 16 дает вам ноль (то есть высделано). Вы'мы разработали цифры 11 и 1, и 11 - это B в шестнадцатеричном формате, а 1 - 1. Итак, ваш результат - 0x1B.
 JimN20 нояб. 2012 г., 02:08
Мне нужно на самом деле сделать алгоритм, или я бы неничему не научился -- хорошо. Однако я'Сделайте еще один шаг вперед и скажите, что если вы хотите чему-то научиться, вы должны сами разобраться в алгоритме (вместо того, чтобы кто-то это дал вам). Если вы хотите быть программистом, вы должны быть (или становиться) хорошими в головоломках. Это хорошее упражнение.
 Hot Licks20 нояб. 2012 г., 02:18
Первый намек:int не является десятичным Десятичный это как.1253int представляет собой числовое значение, которое не имеет встроенного представления, но может быть представлено как базовое 2 (двоичное), базовое 8 (восьмеричное), базовое 10 (десятичное) или базовое 16 (шестнадцатеричное) или, если вы действительно хотите, базовое 27. Вам нужны процедуры для преобразования каждой базы в / изint внутреннее представительство.
 flyingpretzels20 нояб. 2012 г., 02:29
Я так понимаюНичего особенногоABCDEF», Но оINT» не десятичный ... Я думаю, я понимаю, что это означает буквально, как не все десятичные числа являются целыми числами, и что выЯ положил вINT» переменная может быть представлена в любой базе, но как? Я знаю, что для двоичного кода вы получаете остаток от деления числа, деленного на 2 ... Это просто заменить 2 на 16 в шестнадцатеричном?
 Hot Licks20 нояб. 2012 г., 02:41
Обратите внимание, что один метод может преобразовать целое число в любую базу - вы просто вводите N в качестве параметра. Переход к другому был вопросом умножения на N и сложения (после преобразования в него печатной цифры 'чисто числовое значение).

Ответы на вопрос(13)

Следующее преобразует десятичную дробь в шестнадцатеричную десятичную с временной сложностью: O (n) Линейное время без какой-либо встроенной функции Java

private static String decimalToHexaDecimal(int N) {
    char hexaDecimals[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
    StringBuilder builder = new StringBuilder();
    int base= 16;
    while (N != 0) {
        int reminder = N % base;
        builder.append(hexaDecimals[reminder]);
        N = N / base;
    }

    return builder.reverse().toString();
}

Другое возможное решение:

public String DecToHex(int dec){
  char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
              'A', 'B', 'C', 'D', 'E', 'F'};
  String hex = "";
  while (dec != 0) {
      int rem = dec % 16;
      hex = hexDigits[rem] + hex;
      dec = dec / 16;
  }
  return hex;
}
 rgettman10 февр. 2015 г., 23:37
Код только отвечает неСкажи много. Пожалуйста, добавьте объяснение, почему вы думаете, что ваш код является решением.
 MadMad66619 мая 2015 г., 17:49
У вас есть реализация для преобразования обратно из HEX STRING в Integer? Или вообразить, что я хочу изменить цифры и создать другую базу, например, базу 20?

Посмотрите код ниже для десятичного в шестнадцатеричное преобразование,

import java.util.Scanner;

public class DecimalToHexadecimal
{
   public static void main(String[] args)
   {
      int temp, decimalNumber;
      String hexaDecimal = "";
      char hexa[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

      Scanner sc = new Scanner(System.in);
      System.out.print("Please enter decimal number : ");
      decimalNumber = sc.nextInt();

      while(decimalNumber > 0)
      {
         temp = decimalNumber % 16;
         hexaDecimal = hexa[temp] + hexaDecimal;
         decimalNumber = decimalNumber / 16;
      }

      System.out.print("The hexadecimal value of " + decimalNumber + " is : " + hexaDecimal);      
      sc.close();
   }
}

Вы можете узнать больше о различных способах преобразования десятичного числа в шестнадцатеричное по следующей ссылке >> Java преобразует десятичное в шестнадцатеричное.

Мне нужна функция, которая принимает int dec и возвращает гекс String.

Я нашел более элегантное решение отhttp://introcs.cs.princeton.edu/java/31datatype/Hex2Decimal.java.html , Я немного изменился с оригинала (см. Редактирование)

// precondition:  d is a nonnegative integer
public static String decimal2hex(int d) {
    String digits = "0123456789ABCDEF";
    if (d  0) {
        int digit = d % base;              // rightmost digit
        hex = digits.charAt(digit) + hex;  // string concatenation
        d = d / base;
    }
    return hex;
}

Отказ от ответственности: я использую этот алгоритм в моем интервью по кодированию. Я надеюсь, что это решение неслишком популярным :)

Редактировать 17 июня 2016 : Я добавилbase переменная, чтобы дать гибкость, чтобы перейти в любую базу: двоичную, восьмеричную, основание 7 ...

Согласно комментариям, это решение является наиболее элегантным, поэтому я удалил реализацию.Integer.toHexString()

Редактировать 4 сентября 2015 : Я нашел более элегантное решениеhttp://introcs.cs.princeton.edu/java/31datatype/Hex2Decimal.java.html

 Semmel17 июн. 2016 г., 10:30
Это мой предпочтительный ответ, так как это лучшее представление о том, что вы на самом деле будете делать вручную. Очень элегантно.
 dynamic07 мар. 2016 г., 20:45
Вы можете удалить всю свою первую часть и оставить второе решение, которое элегантно
 KKlalala29 окт. 2016 г., 09:11
Что если d может быть отрицательным
Решение Вопроса

Одно из возможных решений:

import java.lang.StringBuilder;

class Test {
  private static final int sizeOfIntInHalfBytes = 8;
  private static final int numberOfBitsInAHalfByte = 4;
  private static final int halfByte = 0x0F;
  private static final char[] hexDigits = { 
    '0', '1', '2', '3', '4', '5', '6', '7', 
    '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
  };

  public static String decToHex(int dec) {
    StringBuilder hexBuilder = new StringBuilder(sizeOfIntInHalfBytes);
    hexBuilder.setLength(sizeOfIntInHalfBytes);
    for (int i = sizeOfIntInHalfBytes - 1; i >= 0; --i)
    {
      int j = dec & halfByte;
      hexBuilder.setCharAt(i, hexDigits[j]);
      dec >>= numberOfBitsInAHalfByte;
    }
    return hexBuilder.toString(); 
  }

  public static void main(String[] args) {
     int dec = 305445566;
     String hex = decToHex(dec);
     System.out.println(hex);       
  }
}

Выход:

1234BABE

В любом случае, для этого есть библиотечный метод:

String hex = Integer.toHexString(dec);
 kol05 дек. 2013 г., 22:17
@AnkitSingla Тогда используйтеlong вместоint :) Или используйтеjava.math.BigInteger, И его ,bitLengthand а такжеrightShift методы. Существует также встроенный метод преобразования для:BigIntegerpublic String toString(int radix)просто позвони16 как.radix
 kol20 нояб. 2012 г., 08:47
@ StephhenC Вы правы, но тогда для чего этот сайт? Помогать людям делать домашнее задание - это плохо, но помогать профессиональным программистам выполнять их настоящую работу - нет? Каждый может найти низкокачественные решения для своих задач программирования. SO делает мир лучше, собирая и выбирая качественные решения. В любом случае, я верю, что ОП мог бы многому научиться из моего решения :)
 Ankit Singla05 дек. 2013 г., 07:36
Но что, если число, которое мы хотим преобразовать, выходит за пределы целого числа?
 Stephen C20 нояб. 2012 г., 03:56
Теперь ОП выигралмногому научиться у "делать» его домашняя работа. Молодец ... НЕ !!
 Vineet Kosaraju20 нояб. 2012 г., 02:56
Я считаю, что вы также можете использовать Integer.parseInt
 Stephen C20 нояб. 2012 г., 14:07
@kol - нет профессионалаКогда-либо игнорироватьInteger.toHexString() и реализуй это сам. "Во всяком случае, я верю, что ОП мог бы многому научиться из моего решения " - и я верю, что ОП узнает более важные вещи, если он / онаЯ читаю это. Точка ОП 'Это домашнее задание, чтобы научиться программировать. Вы учитесь программировать, написав свои собственные (для начала) уродливые решения, а не читая элегантные решения других людей.
 kol20 нояб. 2012 г., 14:32
@StephenC "ни один профессионал никогда не проигнорирует Integer.toHexString () и сам его реализует " Это возвращает воспоминания ... Несколько лет назад в ходе собеседования мы попросили кандидатов "написать функцию обрезки в Delphi, C / C ++, C # или Java ", Мы хотели проверить, могут ли они написать простой алгоритм. Было шокирующим осознавать, чтокаждый Заявитель (из примерно 25!) написал функцию, которая просто вызывала встроенную функцию Trim, и вернула ее результат. Даже девушка, которая оказалась лучшей, сделала это. Когда я спросил ее почему, она посмотрела на меня так, будто я идиот :)

Рассмотрим метод dec2m ниже для преобразования из dec в hex, oct или bin.

Пример вывода

28 dec == 11100 bin 28 dec == 34 oct 28 dec == 1C hex

public class Conversion {
    public static void main(String[] argv) {
        int x = 28;                           // sample number
        if (argv.length > 0)
            x = Integer.parseInt(argv[0]);    // number from command line

        System.out.printf("%d dec == %s bin\n", i, dec2m(x, 2));
        System.out.printf("%d dec == %s oct\n", i, dec2m(x, 8));
        System.out.printf("%d dec == %s hex\n", i, dec2m(x, 16));
    }

    static String dec2m(int N, int m) {
        String s = "";
        for (int n = N; n > 0; n /= m) {
            int r = n % m;
            s = r < 10 ? r + s : (char) ('A' - 10 + r) + s;
        }
        return s;
    }
}

Вот код для любого номера:

import java.math.BigInteger;

public class Testing {

/**
 * @param args
 */
static String arr[] ={"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"}; 
public static void main(String[] args) {
    String value = "214";
    System.out.println(value + " : " + getHex(value));
}


public static String getHex(String value) {
    String output= "";
    try {
        Integer.parseInt(value);
        Integer number = new Integer(value);
        while(number >= 16){
            output = arr[number%16] + output;
            number = number/16;
        }
        output = arr[number]+output;

    } catch (Exception e) {
        BigInteger number = null;
        try{
            number = new BigInteger(value);
        }catch (Exception e1) {
            return "Not a valid numebr";
        }
        BigInteger hex = new BigInteger("16");
        BigInteger[] val = {};

        while(number.compareTo(hex) == 1 || number.compareTo(hex) == 0){
            val = number.divideAndRemainder(hex);
            output = arr[val[1].intValue()] + output;
            number = val[0];
        }
        output = arr[number.intValue()] + output;
    }

    return output;
}

}

я использую

Long a = Long.parseLong(cadenaFinal, 16 );

так как есть некоторый гекс, который может быть больше целого, и он выдаст исключение

 klaar30 окт. 2015 г., 11:11
Это решение читает строку, содержащую шестнадцатеричное представление числа, и возвращает длинное с этим значением. Другими словами, это не то, о чем просил ФП.
 D4rWiNS30 окт. 2015 г., 11:59
Я просто позволю, если кто-то получит ту же проблему, что и я, на всякий случай

Вот'моя

public static String dec2Hex(int num)
{
    String hex = "";

    while (num != 0)
    {
        if (num % 16 < 10)
            hex = Integer.toString(num % 16) + hex;
        else
            hex = (char)((num % 16)+55) + hex;
        num = num / 16;
    }

    return hex;
}

Лучшее решение для преобразования десятичного в шестнадцатеричное, и это менее сложный

import java.util.Scanner;
public class DecimalToHexa
{
    public static void main(String ar[])
    {
        Scanner sc=new Scanner(System.in);
        System.out.println("Enter a Decimal number: ");
        int n=sc.nextInt();
        if(n0)
        {
            d=n%16;`enter code here`
            n/=16;
            if(d==10)h="A";
            else if(d==11)h="B";
            else if(d==12)h="C";
            else if(d==13)h="D";
            else if(d==14)h="E";
            else if(d==15)h="F";
            else h=""+d;            
            hx=""+h+hx;
        }
        System.out.println("Equivalent HEXA: "+hx);
    }
}        

Код для преобразования DECIMAL -to-> Двоичный, восьмеричный, шестнадцатеричный

public class ConvertBase10ToBaseX {
    enum Base {
        /**
         * Integer is represented in 32 bit in 32/64 bit machine.
         * There we can split this integer no of bits into multiples of 1,2,4,8,16 bits
         */
        BASE2(1,1,32), BASE4(3,2,16), BASE8(7,3,11)/* OCTAL*/, /*BASE10(3,2),*/ 
        BASE16(15, 4, 8){       
            public String getFormattedValue(int val){
                switch(val) {
                case 10:
                    return "A";
                case 11:
                    return "B";
                case 12:
                    return "C";
                case 13:
                    return "D";
                case 14:
                    return "E";
                case 15:
                    return "F";
                default:
                    return "" + val;
                }

            }
        }, /*BASE32(31,5,1),*/ BASE256(255, 8, 4), /*BASE512(511,9),*/ Base65536(65535, 16, 2);

        private int LEVEL_0_MASK;
        private int LEVEL_1_ROTATION;
        private int MAX_ROTATION;

        Base(int levelZeroMask, int levelOneRotation, int maxPossibleRotation) {
            this.LEVEL_0_MASK = levelZeroMask;
            this.LEVEL_1_ROTATION = levelOneRotation;
            this.MAX_ROTATION = maxPossibleRotation;
        }

        int getLevelZeroMask(){
            return LEVEL_0_MASK;
        }
        int getLevelOneRotation(){
            return LEVEL_1_ROTATION;
        }
        int getMaxRotation(){
            return MAX_ROTATION;
        }
        String getFormattedValue(int val){
            return "" + val;
        }
    }

    public void getBaseXValueOn(Base base, int on) {
        forwardPrint(base, on);
    }

    private void forwardPrint(Base base, int on) {

        int rotation = base.getLevelOneRotation();
        int mask = base.getLevelZeroMask();
        int maxRotation = base.getMaxRotation();
        boolean valueFound = false;

        for(int level = maxRotation; level >= 2; level--) {
            int rotation1 = (level-1) * rotation;
            int mask1 = mask < rotation1 ;
            if((on & mask1) > 0 ) {
                valueFound = true;
            }
            if(valueFound)
            System.out.print(base.getFormattedValue((on & mask1) >>> rotation1));
        }
        System.out.println(base.getFormattedValue((on & mask)));
    }

    public int getBaseXValueOnAtLevel(Base base, int on, int level) {
        if(level > base.getMaxRotation() || level < 1) {
            return 0; //INVALID Input
        }
        int rotation = base.getLevelOneRotation();
        int mask = base.getLevelZeroMask();

        if(level > 1) {
            rotation = (level-1) * rotation;
            mask = mask < rotation;
        } else {
            rotation = 0;
        }


        return (on & mask) >>> rotation;
    }

    public static void main(String[] args) {
        ConvertBase10ToBaseX obj = new ConvertBase10ToBaseX();

        obj.getBaseXValueOn(Base.BASE16,12456); 
//      obj.getBaseXValueOn(Base.BASE16,300); 
//      obj.getBaseXValueOn(Base.BASE16,7); 
//      obj.getBaseXValueOn(Base.BASE16,7);

        obj.getBaseXValueOn(Base.BASE2,12456);
        obj.getBaseXValueOn(Base.BASE8,12456);
        obj.getBaseXValueOn(Base.BASE2,8);
        obj.getBaseXValueOn(Base.BASE2,9);
        obj.getBaseXValueOn(Base.BASE2,10);
        obj.getBaseXValueOn(Base.BASE2,11);
        obj.getBaseXValueOn(Base.BASE2,12);
        obj.getBaseXValueOn(Base.BASE2,13);
        obj.getBaseXValueOn(Base.BASE2,14);
        obj.getBaseXValueOn(Base.BASE2,15);
        obj.getBaseXValueOn(Base.BASE2,16);
        obj.getBaseXValueOn(Base.BASE2,17);


        System.out.println(obj.getBaseXValueOnAtLevel(Base.BASE2, 4, 1)); 
        System.out.println(obj.getBaseXValueOnAtLevel(Base.BASE2, 4, 2)); 
        System.out.println(obj.getBaseXValueOnAtLevel(Base.BASE2, 4, 3)); 
        System.out.println(obj.getBaseXValueOnAtLevel(Base.BASE2, 4, 4)); 

        System.out.println(obj.getBaseXValueOnAtLevel(Base.BASE16,15, 1)); 
        System.out.println(obj.getBaseXValueOnAtLevel(Base.BASE16,30, 2)); 
        System.out.println(obj.getBaseXValueOnAtLevel(Base.BASE16,7, 1)); 
        System.out.println(obj.getBaseXValueOnAtLevel(Base.BASE16,7, 2)); 

        System.out.println(obj.getBaseXValueOnAtLevel(Base.BASE256, 511, 1)); 
        System.out.println(obj.getBaseXValueOnAtLevel(Base.BASE256, 511, 2)); 
        System.out.println(obj.getBaseXValueOnAtLevel(Base.BASE256, 512, 1));
        System.out.println(obj.getBaseXValueOnAtLevel(Base.BASE256, 512, 2)); 
        System.out.println(obj.getBaseXValueOnAtLevel(Base.BASE256, 513, 2)); 


    }
}
 Kanagavelu Sugumar12 мая 2016 г., 14:52
При понижении голосов; пожалуйста, дайте автору и другим знать причину. Следовательно пост может быть улучшен.

Просто:

  public static String decToHex(int dec)
  {
        return Integer.toHexString(dec);
  }

Как уже упоминалось здесь:Java Конвертировать целое число в шестнадцатеричное целое

 Displee22 февр. 2017 г., 21:10
Лучшее решение.

Самый простой способ сделать это:

String hexadecimalString = String.format("%x", integerValue);

Ваш ответ на вопрос