【发布时间】:2014-09-30 05:42:55
【问题描述】:
我正在尝试编写一个程序,将二进制(带或不带小数)输入转换为几乎完成的十六进制,但不幸的是在十六进制输出中缺少点 (".")。
假设我的预期输出是 e7.6 ,但我得到的是 e76 。
只有"." 丢失了。
这是我的 BinToHex 类..
import java.io.*;
//tried to convert the binary into dec and then dec to hex
public class BinToHex {
double tempDec,fractionpart;
long longofintpart,templongDec;
String inpu ="11100111.011";
String hexOutput=null,tempDecString,hex = null;
static int i = 1;
public void convertbintohex() {
if (inpu.contains(".")) {
int placesAfterPoint = inpu.length() - inpu.indexOf(".") - 1;//every thing
long numerator = Long.parseLong(inpu.replace(".", ""), 2);//goes
double decimalOfInput = ((double) numerator) / (1L << placesAfterPoint);//alright till here
while (true) {
tempDec = decimalOfInput * 16;
if (tempDec == (int)tempDec) {
tempDecString = String.valueOf((long)tempDec);
templongDec = Long.parseLong(tempDecString, 10);
hexOutput = Long.toHexString(templongDec);
break;
} else {
longofintpart = (long)tempDec;
hex=Long.toHexString(longofintpart);
if(i==1){
hexOutput = hex + ".";
i=i+1;
}else{
hexOutput = hexOutput + hex;
}
fractionpart = tempDec-(int)tempDec;
decimalOfInput = fractionpart;
}
}
} else {
// this part is ok
tempDecString = String.valueOf(Integer.parseInt(inpu, 2));
templongDec = Long.parseLong(tempDecString, 10);
hexOutput = Long.toHexString(templongDec);
}
System.out.println(hexOutput);
}
}
我的主要测试类..
public class Test{
public static void main(String args[]){
BinToHex i = new BinToHex();
i.convertbintohex();
}
}
我被困住了! 请帮忙。
【问题讨论】:
-
好吧-我必须承认...我完全被你的代码弄糊涂了^^完全^^你能不能把那个代码分成更多的方法来指出你做了什么?或者也许你提供一些 cmets 来解释你在这个或那个代码块中做了什么?我真的不想冒犯你,但即使读了两三次我也没有明白^^还有一点是这个问题有很多访客但没有人敢回答,可能是因为上面的原因 - 没有冒犯,真的!!
-
问题是
decimalOfInput初始化器给它一个整数除以 8 的值。将其乘以 16 得到一个整数,因此不输入句点的测试成功。我无法告诉您如何解决它,因为就像@MartinFrank 一样,我不知道您要做什么。 -
好的,我告诉你出了什么问题^^
if (tempDec == (int)tempDec)将被联系到!当它到达时,你打电话给break;,当这种情况发生时你永远不会到达代码hexOutput = hex + ".";...所以我猜你只是删除了break-statement ...但这只是一个幸运的猜测...... . 如果我是你,我会尝试拆分字符串并使用Integer.parseInt(str, 16);(十六进制输入)或Integer.parseInt(str, 2);(二进制输入)作为点前后的字符串...... -
为了使用 parseInt 策略,该点后面的字符串需要添加尾随零以使其长度为 4 的倍数。如果将
Integer.parseInt(str, 2)应用于“011”,结果将是3,而不是 6。 -
好的,你用的是什么底座?你能提供它你正在使用32位表示吗?还是8位?不要隐瞒它^^