Convertir un número binario a número hexadecimal

Dado un Número Binario , la tarea es convertir el número binario dado a su número hexadecimal equivalente . La entrada podría ser muy grande y puede que no encaje ni siquiera en un int largo largo sin firmar.

Ejemplos: 

Input: 110001110
Output: 18E

Input: 1111001010010100001.010110110011011
Output: 794A1.5B36
 

Enfoque 1: 
Número binario: Un número binario es un número expresado en el sistema numérico binario de base 2, que utiliza solo dos símbolos: 0 (cero) y 1 (uno).

4 Número hexadecimal: Un número hexadecimal es un sistema de numeración posicional con una raíz o base de 16 y utiliza dieciséis símbolos distintos: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A , B, C, D, E y F.
 

Convertir binario a hexadecimal: 
todos sabemos que 2 4 = 16 1
En otras palabras, un solo dígito en base 16 se puede representar usando 4 dígitos en base 2.  

Para convertir un número binario a hexadecimal, se toman los siguientes pasos: 

  1. Agrupa el Número Binario dado en grupos de 4 bits, cada grupo tomado individualmente desde la izquierda y la derecha del punto decimal.
  2. Obtenga la longitud de la substring a la izquierda y derecha del punto decimal (‘.’) como left_len y right_len .
  3. Si left_len no es un múltiplo de 4, es decir, no es posible agrupar en un grupo exacto de 4 bits, agregue un número mínimo de 0 al principio para que la longitud de la substring izquierda sea un múltiplo de 4.
  4. De manera similar, si right_len no es un múltiplo de 4, agregue un número mínimo de 0 al final para hacer que la longitud de la substring derecha sea un múltiplo de 4.
  5. Ahora, desde la izquierda, extraiga cada grupo (substrings de longitud 4) uno por uno y agregue su código hexadecimal correspondiente al resultado.
  6. Si se encuentra un decimal (‘.’) en el medio, agréguelo al resultado.

A continuación se muestra la implementación del enfoque anterior: 

C++

// C++ implementation to
// convert a binary number to hexadecimal number
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to create map between binary
// number and its equivalent hexadecimal
void createMap(unordered_map<string, char> *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<string, char> 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<String, Character> 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<String,
        Character> bin_hex_map = new HashMap<String,
                                             Character>();
    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

Python3

## Python implementation to
## convert a binary number to hexadecimal numberh
 
## Function to create map between binary
## number and its equivalent hexadecimal
def createMap(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
def convertBinToHex(bin):
 
    l = len(bin)
    t = bin.find('.')
     
    ## length of string before '.'
    len_left =  None
    if (t != -1):
        len_left = t
    else:
        len_left = l
     
    ## add min 0's in the beginning to make
    ## left substring length divisible by 4
    for i in range(1, 1 + (4 - len_left % 4) % 4):
        bin = '0' + bin;
     
    ## if decimal point exists
    if (t != -1):
        ## length of string after '.'
        len_right = l - len_left - 1
         
        ## add min 0's in the end to make right
        ## substring length divisible by 4
        for i in range(1, 1 + (4 - len_right % 4) % 4):
            bin = bin + '0'
     
    ## create map between binary and its
    ## equivalent hex code
    bin_hex_map = {}
    createMap(bin_hex_map)
     
    i = 0;
    hex = ""
     
    while True:
        ## one by one extract from left, substring
        ## of size 4 and add its hex code
        hex += bin_hex_map[bin[i: i+4]];
        i += 4;
        if (i == len(bin)):
            break;
             
        ## if '.' is encountered add it
        ## to result
        if (bin[i] == '.'):
            hex += '.';
            i+=1
     
    ## required hexadecimal number
    return hex;
 
## Driver code
if __name__=='__main__':
 
    bin = "1111001010010100001.010110110011011"
    print("Hexadecimal number =", convertBinToHex(bin));
 
    # This code is contributed by subhamgoyal2014.

C#

// C# implementation to convert a
// binary number to hexadecimal number
 
using System;
using System.Collections.Generic;
 
public class GFG {
 
    // Function to create map between binary
    // number and its equivalent hexadecimal
    static IDictionary<string, char>
    createMap(IDictionary<string, char> um)
    {
        um.Add("0000", '0');
        um.Add("0001", '1');
        um.Add("0010", '2');
        um.Add("0011", '3');
        um.Add("0100", '4');
        um.Add("0101", '5');
        um.Add("0110", '6');
        um.Add("0111", '7');
        um.Add("1000", '8');
        um.Add("1001", '9');
        um.Add("1010", 'A');
        um.Add("1011", 'B');
        um.Add("1100", 'C');
        um.Add("1101", 'D');
        um.Add("1110", 'E');
        um.Add("1111", 'F');
        return um;
    }
 
    // Function to find hexadecimal
    // equivalent of binary
    static String convertBinToHex(String bin)
    {
        int i;
        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 (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 (i = 1; i <= (4 - len_right % 4) % 4; i++)
                bin = bin + '0';
        }
 
        // Create map between binary and its
        // equivalent hex code
        IDictionary<string, char> bin_hex_map
            = new Dictionary<string, char>();
 
        bin_hex_map = createMap(bin_hex_map);
 
        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[bin.Substring(i, 4)];
            i += 4;
 
            if (i == bin.Length)
                break;
 
            // If '.' is encountered add it
            // to result
            if (bin[i] == '.') {
                hex += '.';
                i++;
            }
        }
 
        // Required hexadecimal number
        return hex;
    }
    public static void Main(string[] args)
    {
        string bin = "1111001010010100001.010110110011011";
 
        Console.WriteLine("Hexadecimal number = "
                          + convertBinToHex(bin));
    }
}
 
// This code is contributed by phasing17.

Javascript

// JavaScript implementation to
// convert a binary number to hexadecimal number
 
// Function to create map between binary
// number and its equivalent hexadecimal
function createMap(um)
{
    um.set("0000", '0');
    um.set("0001", '1');
    um.set("0010", '2');
    um.set("0011", '3');
    um.set("0100", '4');
    um.set("0101", '5');
    um.set("0110", '6');
    um.set("0111", '7');
    um.set("1000", '8');
    um.set("1001", '9');
    um.set("1010", 'A');
    um.set("1011", 'B');
    um.set("1100", 'C');
    um.set("1101", 'D');
    um.set("1110", 'E');
    um.set("1111", 'F');
}
 
// function to find hexadecimal
// equivalent of binary
function convertBinToHex(bin)
{
    let l = bin.length;
    let t = bin.indexOf('.');
     
    // length of string before '.'
    let len_left = t != -1 ? t : l;
     
    // add min 0's in the beginning to make
    // left substring length divisible by 4
    for (let i = 1; i <= (4 - len_left % 4) % 4; i++)
        bin.unshift('0');
     
    // if decimal point exists   
    if (t != -1)   
    {
        // length of string after '.'
        let len_right = l - len_left - 1;
         
        // add min 0's in the end to make right
        // substring length divisible by 4
        for (let i = 1; i <= (4 - len_right % 4) % 4; i++)
            bin.push('0');
    }
     
    // create map between binary and its
    // equivalent hex code
    let bin_hex_map = new Map();
    createMap(bin_hex_map);
     
    let i = 0;
    let hex = new Array();
     
    while (1)
    {
        // one by one extract from left, substring
        // of size 4 and add its hex code
         
        hex.push(bin_hex_map.get(bin.slice(i, i+4).join('')));
        i = i + 4;
        if (i == bin.length)
            break;
             
        // if '.' is encountered add it
        // to result
        if (bin[i] == '.')   
        {
            hex.push('.');
            i = i + 1;
        }
    }
     
    // required hexadecimal number
    return hex;   
}
 
// Driver program to test above
let bin = "1111001010010100001.010110110011011";
console.log("Hexadecimal number =", convertBinToHex(bin.split('')).join(''));
 
// The code is contributed by Gautam goel (gautamgoel962)

Producción: 

Hexadecimal number = 794A1.5B36

Complejidad de tiempo: O(n) , donde n es la longitud de la string.
Enfoque 2: otro enfoque para convertir un número binario en un número hexadecimal es convertir primero el número binario en un número decimal y luego convertir el número decimal obtenido en un número hexadecimal equivalente .
Preguntas de práctica: 
(1) Convierta el número binario 111000 a hexadecimal. 
(2) Convierta el número binario 100100001 a hexadecimal. 
(3) Convierta el número binario 1001001111 a hexadecimal. 
(4) ¿Cuál es el equivalente binario del número hexadecimal A7C5? 
(5) ¿Cuál es el equivalente binario del número hexadecimal 2A.FF.
 

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

Este artículo es una contribución de Ayush Jauhari . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *