📌  相关文章
📜  将二进制数转换为十六进制数

📅  最后修改于: 2021-04-26 08:02:45             🧑  作者: Mango

给定一个二进制数,任务是将给定的二进制数转换为其等效的十六进制数。输入可能非常大,甚至可能无法放入一个无符号的long long int中。

例子:

Input: 110001110
Output: 18E

Input: 1111001010010100001.010110110011011
Output: 794A1.5B36
 

方法1:
二进制数:二进制数是在以2为基的二进制数系统中表示的数字,它仅使用两个符号:0(零)和1(一个)。

4 HexaDecimal Number:十六进制数字是一个位置数字系统,其基数或基数为16,并使用十六个不同的符号:即0、1、2、3、4、5、6、7、8、9,A ,B,C,D,E和F。

将Binary转换为HexaDecimal:
我们都知道2 4 = 16 1
换句话说,可以使用以2为底的4位数字来表示以16为底的一位数字。

要将二进制数转换为HexaDecimal,请执行以下步骤:

  1. 将给定的二进制数分为4位,每组分别从小数点的左侧和右侧获取。
  2. 获取子串的左侧和left_lenright_len小数点(“”)的正确的长度。
  3. 如果left_len不是4的倍数,即不可能将其精确分组为4位,则在开头添加最小的0,以使left子串的长度为4的倍数。
  4. 同样,如果right_len不是4的倍数,则在末尾添加最小的0,以使right子字符串的长度为4的倍数。
  5. 现在,从左侧开始,逐个提取每个组(长度为4的子字符串),并将其相应的十六进制代码添加到结果中。
  6. 如果在十进制(’。’)之间遇到,则将其添加到结果中。

下面是上述方法的实现:

C++
// C++ implementation to
// convert a binary number to hexadecimal number
 
#include 
using namespace std;
 
// Function to create map between binary
// number and its equivalent hexadecimal
void createMap(unordered_map *um)
{
    (*um)["0000"] = '0';
    (*um)["0001"] = '1';
    (*um)["0010"] = '2';
    (*um)["0011"] = '3';
    (*um)["0100"] = '4';
    (*um)["0101"] = '5';
    (*um)["0110"] = '6';
    (*um)["0111"] = '7';
    (*um)["1000"] = '8';
    (*um)["1001"] = '9';
    (*um)["1010"] = 'A';
    (*um)["1011"] = 'B';
    (*um)["1100"] = 'C';
    (*um)["1101"] = 'D';
    (*um)["1110"] = 'E';
    (*um)["1111"] = 'F';
}
 
// function to find hexadecimal
// equivalent of binary
string convertBinToHex(string bin)
{
    int l = bin.size();
    int t = bin.find_first_of('.');
     
    // length of string before '.'
    int len_left = t != -1 ? t : l;
     
    // add min 0's in the beginning to make
    // left substring length divisible by 4
    for (int i = 1; i <= (4 - len_left % 4) % 4; i++)
        bin = '0' + bin;
     
    // if decimal point exists   
    if (t != -1)   
    {
        // length of string after '.'
        int len_right = l - len_left - 1;
         
        // add min 0's in the end to make right
        // substring length divisible by 4
        for (int i = 1; i <= (4 - len_right % 4) % 4; i++)
            bin = bin + '0';
    }
     
    // create map between binary and its
    // equivalent hex code
    unordered_map bin_hex_map;
    createMap(&bin_hex_map);
     
    int i = 0;
    string hex = "";
     
    while (1)
    {
        // one by one extract from left, substring
        // of size 4 and add its hex code
        hex += bin_hex_map[bin.substr(i, 4)];
        i += 4;
        if (i == bin.size())
            break;
             
        // if '.' is encountered add it
        // to result
        if (bin.at(i) == '.')   
        {
            hex += '.';
            i++;
        }
    }
     
    // required hexadecimal number
    return hex;   
}
 
// Driver program to test above
int main()
{
    string bin = "1111001010010100001.010110110011011";
    cout << "Hexadecimal number = "
         << convertBinToHex(bin);
    return 0;    
}


Java
// Java implementation to convert a
// binary number to hexadecimal number
import java.io.*;
import java.util.*;
 
class GFG{
 
// Function to create map between binary
// number and its equivalent hexadecimal
static void createMap(Map um)
{
    um.put("0000", '0');
    um.put("0001", '1');
    um.put("0010", '2');
    um.put("0011", '3');
    um.put("0100", '4');
    um.put("0101", '5');
    um.put("0110", '6');
    um.put("0111", '7');
    um.put("1000", '8');
    um.put("1001", '9');
    um.put("1010", 'A');
    um.put("1011", 'B');
    um.put("1100", 'C');
    um.put("1101", 'D');
    um.put("1110", 'E');
    um.put("1111", 'F');
}
 
// Function to find hexadecimal
// equivalent of binary
static String convertBinToHex(String bin)
{
    int l = bin.length();
    int t = bin.indexOf('.');
 
    // Length of string before '.'
    int len_left = t != -1 ? t : l;
 
    // Add min 0's in the beginning to make
    // left substring length divisible by 4
    for(int i = 1;
            i <= (4 - len_left % 4) % 4;
            i++)
        bin = '0' + bin;
 
    // If decimal point exists
    if (t != -1)
    {
         
        // Length of string after '.'
        int len_right = l - len_left - 1;
 
        // Add min 0's in the end to make right
        // substring length divisible by 4
        for(int i = 1;
                i <= (4 - len_right % 4) % 4;
                i++)
            bin = bin + '0';
    }
 
    // Create map between binary and its
    // equivalent hex code
    Map bin_hex_map = new HashMap();
    createMap(bin_hex_map);
 
    int i = 0;
    String hex = "";
 
    while (true)
    {
         
        // One by one extract from left, substring
        // of size 4 and add its hex code
        hex += bin_hex_map.get(
            bin.substring(i, i + 4));
        i += 4;
         
        if (i == bin.length())
            break;
 
        // If '.' is encountered add it
        // to result
        if (bin.charAt(i) == '.')
        {
            hex += '.';
            i++;
        }
    }
 
    // Required hexadecimal number
    return hex;
}
 
// Driver code
public static void main(String[] args)
{
    String bin = "1111001010010100001.010110110011011";
     
    System.out.print("Hexadecimal number = " +
                      convertBinToHex(bin));
}
}
 
// This code is contributed by jithin


输出:

Hexadecimal number = 794A1.5B36


时间复杂度:O(n) ,其中n是字符串的长度。
方法2:将二进制数转换为十六进制数的另一种方法是先将二进制数转换为十进制数,然后将获得的十进制数转换为等效的十六进制数。
练习题:
(1)将二进制数111000转换为十六进制。
(2)将二进制数100100001转换为十六进制。
(3)将二进制数1001001111转换为十六进制。
(4)十六进制数A7C5的二进制等效值是多少。
(5)十六进制数2A.FF的二进制等效值是什么。

Answers:
(1) 38
(2) 121
(3) 24F
(4) 1010011111000101
(5) 101010.11111111