32位二进制转8位的十六进制怎么转

时间:2022-06-07 19:27:47
要写个程序,完成题目功能,要求不能通过十进制中转,直接从二进制转到十六进制,不准用API里的二进制转十六进制的方法.
输入的二进制当字符串输入.(我用的是BLUEJ,输入数据时总是按int接收.) 谢谢了!

13 个解决方案

#1


输入的数据一定是32位的吗?

#2


将32位二进制整数存入4×8的数组里。
然后将每行的四个数按以下方法运算。
a[0] = b[0][0]+(b[0][1]<<1)+(b[0][2]<<2)+(b[0][3]<<3);
.
.
.
依次类推,然后将得出的a[0..3]以16进制输出。

#3


输入的二进制数要是从1位到32位之间都可以.
楼上的,谢谢,但是老师不让用移位做,要用字符串的操作做. 等我完成作业,要用你的方法做一遍.

#4


输入的二进制数长度未知, 如果超过32位,程序就提示输入错误.

#5


哥哥, 用查表法啊.
四个二进制位表示一个16进制.

#6


给你点思路:
import java.util.HashMap;
import java.util.Map;

public class Test {
private Map<String, String> binaryHexPairs; // 二进制, 十六进制对照表

public Test() {
binaryHexPairs = new HashMap<String, String>();
binaryHexPairs.put("0001", "1");
binaryHexPairs.put("0010", "2");
binaryHexPairs.put("0011", "3");
binaryHexPairs.put("0100", "4");
binaryHexPairs.put("0101", "5");
binaryHexPairs.put("0110", "6");
binaryHexPairs.put("0111", "7");
binaryHexPairs.put("1000", "8");
binaryHexPairs.put("1001", "9");
binaryHexPairs.put("1010", "A");
binaryHexPairs.put("1011", "B");
binaryHexPairs.put("1100", "C");
binaryHexPairs.put("1101", "D");
binaryHexPairs.put("1110", "E");
binaryHexPairs.put("1111", "F");
}

public String binaryToHex(String binaryString) {
int prefixLen = (4 - binaryString.length() % 4) % 4;
String prefix = "";
for (int i = 0; i < prefixLen; ++i) {
prefix += "0";
}
binaryString = prefix + binaryString; // 按四的倍数把二进制补齐, 不足的前面补0

// 四个二进制位转换成一个十六进制位
StringBuilder sb = new StringBuilder("0x");
for (int i = 0; i < binaryString.length(); i += 4) {
sb.append(binaryHexPairs.get(binaryString.substring(i, i + 4)));
}

return sb.toString();
}

public static void main(String[] args) {
Test t = new Test();
// String binaryString = "101111";
String binaryString = "1001100111011101010010101";
System.out.println(t.binaryToHex(binaryString));
}

}

#7


检查发现, 少了一个0的对, 加上去就可以了:
binaryHexPairs.put("0000", "0");

#8


感动得内牛满面啊,我之前想到了用MAP,但是老师和同学给的思路都是用字符串substring,charAt操作做,所以一直在字符串上纠结.

有一个问题,关于前面补零的,int prefixLen = (4 - binaryString.length() % 4) % 4 看不懂,最后为什么要%4.为什么不直接用32-binaryString.length()呢.高手请轻拍.

#9


引用 8 楼 unodos 的回复:
感动得内牛满面啊,我之前想到了用MAP,但是老师和同学给的思路都是用字符串substring,charAt操作做,所以一直在字符串上纠结.

 有一个问题,关于前面补零的,int prefixLen = (4 - binaryString.length() % 4) % 4 看不懂,最后为什么要%4.为什么不直接用32-binaryString.length()呢.高手请轻拍.


呵呵,例如二进制"1000", 长度是4, 那么 4 % 4为零,这时4 - 0 则为四,如果不再最后面 %4,那最后就会多出4个0000来,最后的%4不是必须的,因为一个数的前面加0还是等于这个数,只是为了显示更好看一点。

这逻辑全是4来4去,看上去不容易理解,最后的那个%4只是为了显示,加不加都不影响实际的结果。
你可以去掉后试看看结果就知道了。

#10


如果用binaryString.length(),则在001 1101这种情况下,后面4位能正常求出16进制数,但前面3位001在map中却不是关键字,找不到对应的16进制值,要把001补齐为等值四位的 0001 才能找到对应的16进制的值。

#11


明白了! 最后的%4是预防长度为4的整数倍的情况.
我的332-binaryString.length() 补了太多零. 比如有14位,要补两个零,而不是补18个零.
好人啊! 

也谢谢楼上其他的朋友!

#12


Long time no see Java.
因为在招聘会上听人家公司忽悠说Java不行了。结果,几个月的时间就晃过去了。
回头一看,还是Java好。

#13


引用 12 楼 leon57 的回复:
Long time no see Java.
 因为在招聘会上听人家公司忽悠说Java不行了。结果,几个月的时间就晃过去了。
 回头一看,还是Java好。

哈哈, 你真好玩. 要努力.

#1


输入的数据一定是32位的吗?

#2


将32位二进制整数存入4×8的数组里。
然后将每行的四个数按以下方法运算。
a[0] = b[0][0]+(b[0][1]<<1)+(b[0][2]<<2)+(b[0][3]<<3);
.
.
.
依次类推,然后将得出的a[0..3]以16进制输出。

#3


输入的二进制数要是从1位到32位之间都可以.
楼上的,谢谢,但是老师不让用移位做,要用字符串的操作做. 等我完成作业,要用你的方法做一遍.

#4


输入的二进制数长度未知, 如果超过32位,程序就提示输入错误.

#5


哥哥, 用查表法啊.
四个二进制位表示一个16进制.

#6


给你点思路:
import java.util.HashMap;
import java.util.Map;

public class Test {
private Map<String, String> binaryHexPairs; // 二进制, 十六进制对照表

public Test() {
binaryHexPairs = new HashMap<String, String>();
binaryHexPairs.put("0001", "1");
binaryHexPairs.put("0010", "2");
binaryHexPairs.put("0011", "3");
binaryHexPairs.put("0100", "4");
binaryHexPairs.put("0101", "5");
binaryHexPairs.put("0110", "6");
binaryHexPairs.put("0111", "7");
binaryHexPairs.put("1000", "8");
binaryHexPairs.put("1001", "9");
binaryHexPairs.put("1010", "A");
binaryHexPairs.put("1011", "B");
binaryHexPairs.put("1100", "C");
binaryHexPairs.put("1101", "D");
binaryHexPairs.put("1110", "E");
binaryHexPairs.put("1111", "F");
}

public String binaryToHex(String binaryString) {
int prefixLen = (4 - binaryString.length() % 4) % 4;
String prefix = "";
for (int i = 0; i < prefixLen; ++i) {
prefix += "0";
}
binaryString = prefix + binaryString; // 按四的倍数把二进制补齐, 不足的前面补0

// 四个二进制位转换成一个十六进制位
StringBuilder sb = new StringBuilder("0x");
for (int i = 0; i < binaryString.length(); i += 4) {
sb.append(binaryHexPairs.get(binaryString.substring(i, i + 4)));
}

return sb.toString();
}

public static void main(String[] args) {
Test t = new Test();
// String binaryString = "101111";
String binaryString = "1001100111011101010010101";
System.out.println(t.binaryToHex(binaryString));
}

}

#7


检查发现, 少了一个0的对, 加上去就可以了:
binaryHexPairs.put("0000", "0");

#8


感动得内牛满面啊,我之前想到了用MAP,但是老师和同学给的思路都是用字符串substring,charAt操作做,所以一直在字符串上纠结.

有一个问题,关于前面补零的,int prefixLen = (4 - binaryString.length() % 4) % 4 看不懂,最后为什么要%4.为什么不直接用32-binaryString.length()呢.高手请轻拍.

#9


引用 8 楼 unodos 的回复:
感动得内牛满面啊,我之前想到了用MAP,但是老师和同学给的思路都是用字符串substring,charAt操作做,所以一直在字符串上纠结.

 有一个问题,关于前面补零的,int prefixLen = (4 - binaryString.length() % 4) % 4 看不懂,最后为什么要%4.为什么不直接用32-binaryString.length()呢.高手请轻拍.


呵呵,例如二进制"1000", 长度是4, 那么 4 % 4为零,这时4 - 0 则为四,如果不再最后面 %4,那最后就会多出4个0000来,最后的%4不是必须的,因为一个数的前面加0还是等于这个数,只是为了显示更好看一点。

这逻辑全是4来4去,看上去不容易理解,最后的那个%4只是为了显示,加不加都不影响实际的结果。
你可以去掉后试看看结果就知道了。

#10


如果用binaryString.length(),则在001 1101这种情况下,后面4位能正常求出16进制数,但前面3位001在map中却不是关键字,找不到对应的16进制值,要把001补齐为等值四位的 0001 才能找到对应的16进制的值。

#11


明白了! 最后的%4是预防长度为4的整数倍的情况.
我的332-binaryString.length() 补了太多零. 比如有14位,要补两个零,而不是补18个零.
好人啊! 

也谢谢楼上其他的朋友!

#12


Long time no see Java.
因为在招聘会上听人家公司忽悠说Java不行了。结果,几个月的时间就晃过去了。
回头一看,还是Java好。

#13


引用 12 楼 leon57 的回复:
Long time no see Java.
 因为在招聘会上听人家公司忽悠说Java不行了。结果,几个月的时间就晃过去了。
 回头一看,还是Java好。

哈哈, 你真好玩. 要努力.