Java中的十进制到hex转换器

我有一个家庭作业,我需要在十进制,二进制和hex之间进行三向转换。 我需要帮助的函数是将十进制转换为hex。 我几乎不了解hex,但仍然如何将十进制转换为hex。 我需要一个接受int dec并返回String hex的函数。 不幸的是我没有这个function的任何草稿,我完全迷失了。 我只有这个。

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

此外,我不能使用像Integer.toHexString()或其他任何东西的预制函数,我需要实际制作算法,否则我就不会学到任何东西。

一种可能的方案:

 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); 

简单:

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

如上所述: Java将整数转换为hex整数

我需要一个接受int dec并返回String hex的函数。

我从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) return "0"; int base = 16; // flexible to change in any base under 16 String hex = ""; while (d > 0) { int digit = d % base; // rightmost digit hex = digits.charAt(digit) + hex; // string concatenation d = d / base; } return hex; } 

免责声明:我在编码面试中使用此算法。 我希望这个解决方案不会太受欢迎:)

编辑2016年6月17日 :我添加了base变量,以便灵活地更改为任何基数:二进制,八进制,7的基数…
根据评论,这个解决方案是最优雅的,所以我删除了Integer.toHexString()的实现。

编辑2015年9月4日 :我找到了一个更优雅的解决方案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 = {'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; } 

这是任何数字的代码:

 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 ); 

因为有一些hex可能比整数更大,它会抛出exception

这是我的

 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转换为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); } } 

查看下面的代码,了解十进制到hex的转换,

 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 convert decimal to hexadecimal中了解有关将十进制转换为hex的不同方法的更多信息。

以下将十进制转换为带有时间复杂度的Hexa Decimal: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(); } 

转换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 << 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)); } }