从十进制转换为十六进制

时间:2014-11-04 14:38:15

标签: java algorithm

我编写了一个java程序,它应该将小数从1转换为256到十六进制,但是当我尝试使用256以上的小数时,问题就来了,之后我开始得到不正确的结果。 这是我的代码:

public class Conversion {

public static void main(String[] args) {

    System.out.printf("%s%14s", "Decimal", "Hexadecimal");

    for(int i = 1; i <= 300; i++) {
        System.out.printf("%7d          ", i);
        decimalToHex(i);
        System.out.println();
    }

}

private static void decimalToHex(int decimal) {
    int count;
    if(decimal >= 256) {
        count = 2;
    } else {
        count = 1;
    }
    for (int i = 1; i <= count; i++) {
        if(decimal >= 256) {
            returnHex(decimal / 256);
            decimal %= 256;
        }

        if(decimal >= 16) {
            returnHex(decimal / 16);
            decimal %= 16;
        }

        returnHex(decimal);

        decimal /= 16;
    }
}

private static void returnHex(int number) {
    switch(number) {
        case 15:
            System.out.print("F");
            break;
        case 14:
            System.out.print("E");
            break;
        case 13:
            System.out.print("D");
            break;
        case 12:
            System.out.print("C");
            break;
        case 11:
            System.out.print("B");
            break;
        case 10:
            System.out.print("A");
            break;
        default:
            System.out.printf("%d", number);
            break;
    }
}

}

这是我得到的结果样本:

254              FE
255              FF
256              100
257              111
264              199
266              1AA
271              1FF
272              1100
273              1111

注意:我刚刚开始学习java,所以如果可以,请保持简单。谢谢

7 个答案:

答案 0 :(得分:11)

如果decimal小于比较值,您只是忘记打印出零值。显式打印出这些零时,您也不再需要count变量:

private static void decimalToHex(int decimal) {
    if (decimal >= 256) {
        returnHex(decimal / 256);
        decimal %= 256;
    } else {
        System.out.print("0");
    }
    if (decimal >= 16) {
        returnHex(decimal / 16);
        decimal %= 16;
    } else {
        System.out.print("0");
    }
    returnHex(decimal);
    decimal /= 16;
}

当然,这也会改变小值的输出。它打印000,001,......

答案 1 :(得分:3)

使用Integer.toHexString(i)而不是你自己的

答案 2 :(得分:3)

所以Seelenvirtuose对4095以下的数字提出了一个很好的解决方案。让我们走得更远:

主要问题(正如您可能已经注意到的那样)是,您需要预测最高位数的基值是多少。你有一个解决方案,首先检查256,而不是16.Java可以为我们找到合适的值:

private static void decimalToHex(int decimal) {
    // Hex is base-16; maxDigit will hold the factor by which the highest digit needs to be multiplied to get its value
    int maxDigit = 1;
    // the condition left of && is what we want, right is to notice overflow when dealing with e.g. Integer.MAX_VALUE as input
    while(maxDigit * 16 <= decimal && maxDigit > 0) {
        maxDigit *= 16;
    }
    if(maxDigit <= 0) {
        throw new IllegalArgumentException("Can not convert "+ decimal);
    }
    // The left-most digit is the highest, so we need to go from high to low
    for(int digit = maxDigit; digit > 0; digit /= 16) {
        printHex((decimal / digit) % 16);
    }
}

// as this function prints the digits let's call it "printHex"
private static void printHex(int number) {
    switch(number) {
        case 15:
            System.out.print("F");
            break;
        case 14:
            System.out.print("E");
            break;
        case 13:
            System.out.print("D");
            break;
        case 12:
            System.out.print("C");
            break;
        case 11:
            System.out.print("B");
            break;
        case 10:
            System.out.print("A");
            break;
        default:
            System.out.printf("%d", number);
            break;
    }
}

当数字太接近Integer.MAX_VALUE时,高数字的基数值的计算可能会变得昂贵,甚至可能会失败。如果您不想事先计算最高小数的值,可以查看下一个函数。

同样最高位数需要离开,但我们只能安全地计算最低位数,我们计算最低位数并反转序列:

private static void decimalToHex2(int decimal) {
    // We use a StringBuilder so we can generate the digits lowest first
    StringBuilder sb = new StringBuilder();
    while (decimal > 0) {
        sb.append(returnHex(decimal % 16));
        decimal = decimal / 16;
    }
    // Now we can reverse the sequence and are fine
    String hexString = sb.reverse().toString();
    System.out.print(hexString);
}

// as this function returns the digits let's call it "returnHex"
private static char returnHex(int number) {
    switch(number) {
        case 15:
            return 'F';
        case 14:
            return 'E';
        case 13:
            return 'D';
        case 12:
            return 'C';
        case 11:
            return 'B';
        case 10:
            return 'A';
        default:
            return (char) ('0' + number);
    }
}

答案 3 :(得分:2)

嗯,首先由@Seelenvirtuose给出的答案很简单易懂,我只是想要提升自己。 十六进制数为16,所以你不必担心任何其他数字(例如256),这里我简化了你的两种方法如下:

private static void decimalToHex(int num) {
        String output="";
        while(num!=0){
            output=returnHex(num%16)+output;
            num=num/16;
        }
        System.out.println(output);
}

private static String returnHex(int number) {
            switch(number) {
            case 15:
                return "F";
            case 14:
                return "E";
            case 13:
                return "D";
            case 12:
                return "C";
            case 11:
               return "B";
            case 10:
                return "A";
            default:
                return ""+number;
        }
}

我正在使用基数16并循环直到数字为0。 此代码基于您自己的实现。这么容易理解。

答案 4 :(得分:1)

您应该使用此方法将十进制转换为十六进制

 int i = ...
 String hex = Integer.toHexString(i);
 System.out.println("Hex value is " + hex);

您可以在此链接中找到更多详细信息

http://www.javamex.com/tutorials/conversion/decimal_hexadecimal.shtml

答案 5 :(得分:1)

尝试或改编您的代码:

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

来源:https://stackoverflow.com/a/13465128/4017037

答案 6 :(得分:1)

既然你在问题中已经提到你刚刚开始学习java而你想保持简单,我建议通过下面的例子来了解更多关于java中十进制到十六进制的转换,

decimal to hexadecimal java program示例。