- Десятичное в шестнадцатеричное преобразование в Java
- 13 ответов
- Converting from Base 10 to 16 (Decimal to Hex) in Java
- The solution in Java code#
- Test cases to validate our solution#
- Additional test cases#
- Top Related Articles
- Перевод из десятичной в шестнадцатеричную систему счисления java
- Java Decimal to Hex conversion: Custom Logic
- Feedback
- Help Others, Please Share
- Learn Latest Tutorials
- Preparation
- Trending Technologies
- B.Tech / MCA
- Javatpoint Services
- Training For College Campus
Десятичное в шестнадцатеричное преобразование в Java
У меня есть домашнее задание, где мне нужно сделать трехстороннее преобразование между десятичным, двоичным и шестнадцатеричным. Функция, в которой мне нужна помощь, состоит в преобразовании десятичной дроби в шестнадцатеричную. У меня почти нет понимания шестнадцатеричного, тем не менее, как преобразовать десятичный знак в шестнадцатеричный. Мне нужна функция, которая принимает int dec и возвращает String hex . К сожалению, у меня нет никакого проекта этой функции, я полностью потерян. Все, что у меня есть, это.
public static String decToHex(int dec)
Также я не могу использовать эти готовые функции, такие как Integer.toHexString() или что-то еще, мне нужно сделать алгоритм, иначе я бы ничего не узнал.
«Мне нужно сделать алгоритм, иначе я бы ничего не узнал» — хорошо. Однако я бы сделал еще один шаг вперед и сказал бы, что если вы хотите чему-то научиться, вы должны сами разобраться в алгоритме (вместо того, чтобы кто-то его дал вам). Если вы хотите быть программистом, вы должны быть (или становиться) хорошими в головоломках. Это хорошее упражнение.
Да, я понимаю. Тем не менее, я сижу здесь, почесывая голову, работая над этим. Если бы я не был полностью вне идей и все еще знал, что делать, я бы не пришел сюда в StackOverflow.
У вас есть понимание шестнадцатеричного подсчета? Как и двоичный счет, за исключением того, что вместо двух наборов чисел вы используете 16. 0 = 0x0 1 = 0x1 . 9 = 0x9 10 = 0xA 11 = 0xB . 15 = 0XF 16 = 0X11 .
У меня минимальное понимание. Я смотрел некоторые видео-уроки Youtube и разбираюсь в самих основах, например, «А представляет 10» и так далее, пока «F» не станет 16, а затем вы начинаете новый сет. Это 0x0 и 0xA, не знаю. Я просто второкурсник в старшей школе, и мы даже официально не узнали о гексах.
Первый совет: int не является десятичным. Десятичный, как 1253 . int — это числовое значение, которое не имеет встроенного представления, но может быть представлено как base 2 (двоичное число), base 8 (восьмеричное), base 10 (десятичное) или base 16 (шестнадцатеричное) или, если вы действительно хотите, база 27. То, что вы хотите, это процедуры для преобразования каждой базы в / из внутреннего представления int .
Нет ничего особенного в том, что ABCDEF — это 10,11,12,13,14,15 — это просто наиболее очевидное назначение символов для 16-значных базовых символов. Представьте себе, если бы у нас было только 8 пальцев и только цифры 0-7. Тогда мы могли бы представить десятичную дробь с символом A для 8 и B для 9. Или мы могли бы представить шестнадцатеричное с символами !@#$%^ Вместо символов ABCDEF — в выборе нет ничего особенного / священного.
Это базовая проблема конверсии. Возможно, хорошим местом для начала будет таблица ASCII — asciitable.com
Я понимаю, что нет ничего особенного в «ABCDEF». Но насчет того, чтобы int не был десятичным . Я думаю, я понимаю, что это буквально означает, что не все десятичные числа являются целыми числами, и то, что вы поместите в переменную int, может быть представлено в любой базе, но как? Я знаю, что для двоичного кода вы получаете остаток от деления числа, деленного на 2 . Это просто заменить 2 на 16 в шестнадцатеричном?
Учитесь по модулю деления — оператор % . Повторно делите (целое) число на основание N и берите оставшуюся часть (результат % деления) как цифру, уменьшая при этом свое первоначальное значение с помощью / деления. Это даст вам цифры номера в базе N справа налево. Например, 27 десятичное число — это гекс 0x1B. Так что сделайте 27 % 16 и вы получите 11. Делайте 27 / 16 и вы получите 1. Повтор с 1 % 16 дает вам 1, а 1 / 16 дает вам ноль (что означает, что вы сделали). Вы разработали цифры 11 и 1, и 11 — это B в шестнадцатеричном формате, а 1 — это 1. Итак, ваш результат 0x1B.
Обратите внимание, что один метод может преобразовать целое число в любую базу — вы просто вводите N в качестве параметра. Переход к другому был вопросом умножения на N и сложения (после преобразования печатной цифры в ее чисто числовое значение).
Я понял! То, что вы только что сказали, имело смысл для меня конвертировать в любую базу, и я объединил это с массивом возможных цифр, как у kol здесь, и это сработало! И я на самом деле понимаю! Большое спасибо!
13 ответов
Одно из возможных решений:
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); >>
Во всяком случае, для этого есть библиотечный метод:
String hex = Integer.toHexString(dec);
@StephenC StephhenC Вы правы, но тогда для чего этот сайт? Помогать людям делать домашнее задание — это плохо, но помогать профессиональным программистам выполнять их настоящую работу — нет? Каждый может найти низкокачественные решения для своих задач программирования. SO делает мир лучше, собирая и выбирая качественные решения. В любом случае, я верю, что ОП мог бы многому научиться из моего решения 🙂
@kol — ни один профессионал никогда не будет игнорировать Integer.toHexString() и реализовывать его самостоятельно. «В любом случае, я верю, что ОП мог бы многому научиться из моего решения» — и я верю, что ОП узнал бы более важные вещи, если бы он не читал его. Суть домашнего задания ОП в том, чтобы научиться программировать. Вы учитесь программировать, написав свои собственные (для начала) уродливые решения, а не читая элегантные решения других людей.
@StephenC «ни один профессионал никогда не проигнорирует Integer.toHexString () и сам его реализует». Это возвращает воспоминания . Несколько лет назад в ходе собеседования мы попросили кандидатов «написать функцию Trim в Delphi, C / C ++ , C # или Java «. Мы хотели проверить, могут ли они написать простой алгоритм. Было шокирующим осознавать, что каждый заявитель (из примерно 25!) Написал функцию, которая просто вызывала встроенную функцию Trim и возвращала ее результат. Даже девушка, которая оказалась лучшей, сделала это. Когда я спросил ее почему, она посмотрела на меня так, будто я идиот 🙂
@AnkitSingla Тогда используйте long вместо int 🙂 Или используйте java.math.BigInteger , его bitLength , and и rightShift . Для BigInteger также есть встроенный метод преобразования: public String toString(int radix) , просто вызовите его с 16 в качестве radix .
public static String decToHex(int dec)
Мне нужна функция, которая принимает 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
Это мой предпочтительный ответ, так как это лучшее представление о том, что вы на самом деле будете делать вручную. Очень элегантно.
Рассмотрим метод 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; > >
public String DecToHex(int dec)< char[] hexDigits = ; String hex = ""; while (dec != 0) < int rem = dec % 16; hex = hexDigits[rem] + hex; dec = dec / 16; >return hex; >
Ответы только кода не говорят много. Пожалуйста, добавьте объяснение, почему вы думаете, что ваш код является решением.
У вас есть реализация для преобразования обратно из HEX STRING в Integer? Или вообразить, что я хочу изменить цифры и создать другую базу, например, базу 20?
это небольшая библиотека, которая должна помочь вам с шестнадцатеричными в Java: https://github.com/PatrykSitko/HEX4J
Следующее преобразует десятичную дробь в шестнадцатеричную десятичную с временной сложностью: 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(); >
Ознакомьтесь с приведенным ниже кодом для преобразования десятичного в шестнадцатеричное,
import java.util.Scanner; public class DecimalToHexadecimal < public static void main(String[] args) < int temp, decimalNumber; String hexaDecimal = ""; char hexa[] = ; 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 конвертировать десятичную в шестнадцатеричную.
Лучшее решение для преобразования Decimal To HexaDecimal, и этот менее сложный
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(n<0) < System.out.println("Enter a positive integer"); return; >int i=0,d=0; String hx="",h=""; while(n>0) < 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); > >
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; >
Код для преобразования DECIMAL -to- > BINARY, OCTAL, HEXADECIMAL
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 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 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)); >>
При понижении голосов; пожалуйста, дайте автору и другим знать причину. Следовательно пост может быть улучшен.
Converting from Base 10 to 16 (Decimal to Hex) in Java
Convert an integer which is base 10, to a hexadecimal base 16 string .
Java provides various built-in options such as Integer.toString(a, 16) , or String.format(«0x%X», a) , or Integer.toHexString(a)
The solution in Java code#
public class Hexadecimal < private static final String hexDigits = "0123456789ABCDEF"; public static String convertToHex(int a) < String hexadecimal = ""; while (a >0) < int digit = a % 16; hexadecimal = hexDigits.charAt(digit) + hexadecimal; a = a / 16; >return "0x" + hexadecimal; > >
public class Hexadecimal< private static final String HEX = "0123456789ABCDEF"; public static String convertToHex(int a)< final StringBuilder sb = new StringBuilder(""); while (a != 0) < sb.append(HEX.charAt((a & 0xf))); a = a >> 4; > return "0x" + sb.reverse().toString(); > >
public class Hexadecimal < private static final char[] numbers = ; public static String convertToHex(int a) < if (a < 16) return "0x" + numbers[a]; return convertToHex(a/16) + numbers[a%16]; >>
Test cases to validate our solution#
import org.junit.Test; import static org.junit.Assert.assertEquals; public class HexadecimalShould < @Test public void test ()< assertEquals("0x100",Hexadecimal.convertToHex(256)); >>
Additional test cases#
import org.junit.Test; import java.util.HashMap; import static org.junit.Assert.assertEquals; public class HexadecimalShould < @Test public void test ()< assertEquals("0x100",Hexadecimal.convertToHex(256)); int numbers[] = new int[1000]; for (int i = 0; i < numbers.length; i++) < numbers[i] = (int)Math.floor(Math.random()*4294967295.); assertEquals((new Hex()).convertToHex(numbers[i]),Hexadecimal.convertToHex(numbers[i])); >> private class Hex < public String convertToHex(int a) < String num = ""; HashMapmapeo = new HashMap<>(); for (int i = 0; i < 10; i++) mapeo.put(i + "", i + ""); mapeo.put("10", "A"); mapeo.put("11", "B"); mapeo.put("12", "C"); mapeo.put("13", "D"); mapeo.put("14", "E"); mapeo.put("15", "F"); while (a >= 16) < num += mapeo.get(a % 16 + "") + ""; a /= 16; >num += mapeo.get(a + ""); return "0x"+(new StringBuilder(num)).reverse().toString(); > > >
Top Related Articles
- String polynomial converter in Java
- How to Remove all Exclamation Marks from a String in Java
- How to Convert a Number to a String in Java
- How to Remove Spaces in a String in Java
- How many stairs will Suzuki climb in 20 years? in Java
- Determine if N is divisible by X and Y in Java
- How to Sum a Mixed Array in Java
- Calculate the Volume of a Cuboid in Java
- Find the first non-consecutive number in Java
- Alternating String Casing in Java
Перевод из десятичной в шестнадцатеричную систему счисления java
Java Decimal to Hex conversion: Custom Logic
We can convert decimal to hex in java using custom logic.
Hexadecimal of 10 is: A Hexadecimal of 15 is: F Hexadecimal of 289 is: 121
For Videos Join Our Youtube Channel: Join Now
Feedback
Help Others, Please Share
Learn Latest Tutorials
Preparation
Trending Technologies
B.Tech / MCA
Javatpoint Services
JavaTpoint offers too many high quality services. Mail us on h[email protected], to get more information about given services.
- Website Designing
- Website Development
- Java Development
- PHP Development
- WordPress
- Graphic Designing
- Logo
- Digital Marketing
- On Page and Off Page SEO
- PPC
- Content Development
- Corporate Training
- Classroom and Online Training
- Data Entry
Training For College Campus
JavaTpoint offers college campus training on Core Java, Advance Java, .Net, Android, Hadoop, PHP, Web Technology and Python. Please mail your requirement at [email protected].
Duration: 1 week to 2 week
Like/Subscribe us for latest updates or newsletter