Java中的十进制转十六进制转换器

22

我有一个作业任务,需要在十进制、二进制和十六进制之间进行三进制转换。我需要帮助的函数是将十进制转换为十六进制。我几乎不了解十六进制,更不知道如何将十进制转换为十六进制。我需要一个函数,它接受一个 int dec 并返回一个 String hex。不幸的是,我没有这个函数的任何草稿,我完全迷失了方向。我仅有以下内容。

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


    return hex;
  }

另外,我不能使用那些预先制作的函数,比如Integer.toHexString()之类的任何函数,我需要实际编写算法,否则我将一无所获。


10
“我需要实际制定算法,否则我就学不到什么”——很好。但我认为更进一步的是,如果你想学到东西,你必须自己去找出算法(而不是别人把它交给你)。如果你要成为软件程序员,你需要擅长解决难题。这是一个很好的练习。 - JimN
1
你是否理解十六进制计数?类似于二进制计数,不同之处在于使用16组数字而不是2组。0 = 0x01 = 0x1...9 = 0x910 = 0xA11 = 0xB...15 = 0xF16 = 0x11... - Terrell Plotzki
ABCDEF被赋值为10、11、12、13、14、15并没有什么特别之处,它只是将符号分配给十六进制数字的最明显的方式。想象一下,如果我们只有8个手指和数字0-7,则我们可以用字符A表示8,用字符B表示9来表示十进制。或者,我们可以使用!@#$%^代替字符ABCDEF来表示十六进制——这些选择并没有什么特别/神圣的地方。 - Hot Licks
这是一个进制转换问题。也许一个好的起点是ASCII表 - http://www.asciitable.com - Christian Trimble
2
我搞定了!你刚才说的对于转换到任何进制都非常有道理,我将其与可能数字的数组结合起来,就像kol在这里一样,它奏效了!我真的明白了!非常感谢! - flyingpretzels
显示剩余7条评论
12个回答

38

一个可能的解决方案:

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

5
现在,OP不会从“做”他的作业中学到很多。干得好……并不是!! - Stephen C
12
@StephenC 您说得对,但这个网站是用来做什么的呢?帮助人们完成功课是不好的,但帮助专业程序员完成他们的真正工作就不是坏事了吗?每个人都可以在谷歌上搜索到一些低质量的编程解决方案。SO 通过收集和筛选高质量的解决方案让世界变得更美好。无论如何,我相信问题的提出者可以从我的解决方案中学到很多知识 :) - kol
4
@kol - 任何专业人士都不会忽视 Integer.toHexString() 方法并自己实现它。 "无论如何,我相信原帖的作者可以从我的解决方案中学到很多东西"——而我认为如果他/她不去阅读它,原帖作者将会学到更重要的东西。原帖作业的重点是学习如何编程。通过编写自己的(起初可能很丑陋的)解决方案来学习编程,而不是阅读别人优美的解决方案。 - Stephen C
但是如果我们想要转换的数字超出了整数范围怎么办? - Ankit Singla
1
@AnkitSingla 那就使用 long 而不是 int :) 或者使用 java.math.BigInteger,以及它的 bitLengthandrightShift 方法。此外,BigInteger 还有一个内置的转换方法:public String toString(int radix),只需将 radix 设置为 16 即可调用它。 - kol
显示剩余2条评论

29

1
最佳解决方案。 - Displee

14

我需要一个函数,它接收一个整数 dec ,并返回一个字符串 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


你可以删除所有的第一部分,只留下第二个解决方案,那是优雅的。 - dynamic
这是我首选的答案,因为它最好地代表了你手动执行的操作。非常优雅。 - Semmel
如果d可以为负数,会怎么样? - KKlalala

2
考虑使用下面的dec2m方法将十进制转换为十六进制、八进制或二进制。
示例输出为:
28 十进制 == 11100 二进制 28 十进制 == 34 八进制 28 十进制 == 1C 十六进制
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;
    }
}

1
另一个可能的解决方案:
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;
}

1
仅仅给出代码并不能解释太多问题。请加上一些解释,说明为什么你的代码是一个解决方案。 - rgettman
你有将十六进制字符串转换回整数的实现吗?或者,想象一下我想改变数字并创建不同的基数,例如20进制? - MadMad666

1
这是任意数字的代码:

Here is the code for any number :

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

}

1
最简单的方法是:
String hexadecimalString = String.format("%x", integerValue);

0

我将使用

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

由于有些十六进制数可能比整数更大,因此会引发异常。


这个解决方案读取包含一个十六进制表示的数字的字符串,并返回具有该值的长整型。换句话说,这不是问题提出者所要求的。 - klaar
1
我只是把它放在那里,以防万一有人遇到和我一样的问题。 - D4rWiNS

0
以下是将十进制转换为十六进制的代码,时间复杂度为 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();
}

0

这是我的

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接