我编写了一个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,所以如果可以,请保持简单。谢谢
答案 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);
}
}
答案 6 :(得分:1)
既然你在问题中已经提到你刚刚开始学习java而你想保持简单,我建议通过下面的例子来了解更多关于java中十进制到十六进制的转换,