Convertir un número binario a octal

El problema es convertir el número binario dado (representado como string) a su número octal equivalente. La entrada podría ser muy grande y es posible que no encaje ni siquiera en int largo largo sin firmar.

Ejemplos:  

Input : 110001110
Output : 616

Input  : 1111001010010100001.010110110011011
Output : 1712241.26633 

La idea es considerar la entrada binaria como una string de caracteres y luego seguir los pasos: 

  1. Obtenga la longitud de la substring a la izquierda y a la derecha del punto decimal (‘.’) como left_len y right_len .
  2. Si left_len no es un múltiplo de 3, agregue un número mínimo de 0 al principio para que la longitud de la substring izquierda sea un múltiplo de 3.
  3. Si right_len no es un múltiplo de 3, agregue un número mínimo de 0 al final para que la longitud de la substring derecha sea un múltiplo de 3.
  4. Ahora, desde la izquierda, extraiga una por una las substrings de longitud 3 y agregue su código octal correspondiente al resultado.
  5. Si se encuentra un decimal (‘.’) en el medio, agréguelo al resultado.

C++

// C++ implementation to convert a binary number
// to octal number
#include <bits/stdc++.h>
using namespace std;
  
// function to create map between binary
// number and its equivalent octal
void createMap(unordered_map<string, char> *um)
{
    (*um)["000"] = '0';
    (*um)["001"] = '1';
    (*um)["010"] = '2';
    (*um)["011"] = '3';
    (*um)["100"] = '4';
    (*um)["101"] = '5';
    (*um)["110"] = '6';
    (*um)["111"] = '7';   
}
  
// Function to find octal equivalent of binary
string convertBinToOct(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 3
    for (int i = 1; i <= (3 - len_left % 3) % 3; 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 3
        for (int i = 1; i <= (3 - len_right % 3) % 3; i++)
            bin = bin + '0';
    }
      
    // create map between binary and its
    // equivalent octal code
    unordered_map<string, char> bin_oct_map;
    createMap(&bin_oct_map);
      
    int i = 0;
    string octal = "";
      
    while (1)
    {
        // one by one extract from left, substring
        // of size 3 and add its octal code
        octal += bin_oct_map[bin.substr(i, 3)];
        i += 3;
        if (i == bin.size())
            break;
              
        // if '.' is encountered add it to result
        if (bin.at(i) == '.')   
        {
            octal += '.';
            i++;
        }
    }
      
    // required octal number
    return octal;   
}
  
// Driver program to test above
int main()
{
    string bin = "1111001010010100001.010110110011011";
    cout << "Octal number = "
         << convertBinToOct(bin);
    return 0;    
} 

Java

// Java implementation to convert a
// binary number to octal 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("000", '0');
    um.put("001", '1');
    um.put("010", '2');
    um.put("011", '3');
    um.put("100", '4');
    um.put("101", '5');
    um.put("110", '6');
    um.put("111", '7');
}
 
// Function to find octal equivalent of binary
static String convertBinToOct(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 3
    for(int i = 1;
            i <= (3 - len_left % 3) % 3;
            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 3
        for(int i = 1;
                i <= (3 - len_right % 3) % 3;
                i++)
            bin = bin + '0';
    }
 
    // Create map between binary and its
    // equivalent octal code
    Map<String,
        Character> bin_oct_map = new HashMap<String,
                                             Character>();
    createMap(bin_oct_map);
 
    int i = 0;
    String octal = "";
 
    while (true)
    {
         
        // One by one extract from left, substring
        // of size 3 and add its octal code
        octal += bin_oct_map.get(
            bin.substring(i, i + 3));
        i += 3;
         
        if (i == bin.length())
            break;
 
        // If '.' is encountered add it to result
        if (bin.charAt(i) == '.')
        {
            octal += '.';
            i++;
        }
    }
 
    // Required octal number
    return octal;
}
 
// Driver code
public static void main(String[] args)
{
    String bin = "1111001010010100001.010110110011011";
    System.out.println("Octal number = " +
                        convertBinToOct(bin));
}
}
 
// This code is contributed by jithin

Python3

# Python3 implementation to convert a binary number
# to octal number
 
# function to create map between binary
# number and its equivalent octal
def createMap(bin_oct_map):
    bin_oct_map["000"] = '0'
    bin_oct_map["001"] = '1'
    bin_oct_map["010"] = '2'
    bin_oct_map["011"] = '3'
    bin_oct_map["100"] = '4'
    bin_oct_map["101"] = '5'
    bin_oct_map["110"] = '6'
    bin_oct_map["111"] = '7'
 
# Function to find octal equivalent of binary
def convertBinToOct(bin):
    l = len(bin)
     
    # length of string before '.'
    t = -1
    if '.' in bin:
        t = bin.index('.')
        len_left = t
    else:
        len_left = l
     
    # add min 0's in the beginning to make
    # left substring length divisible by 3
    for i in range(1, (3 - len_left % 3) % 3 + 1):
        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 3
        for i in range(1, (3 - len_right % 3) % 3 + 1):
            bin = bin + '0'
     
    # create dictionary between binary and its
    # equivalent octal code
    bin_oct_map = {}
    createMap(bin_oct_map)
    i = 0
    octal = ""
     
    while (True) :
         
        # one by one extract from left, substring
        # of size 3 and add its octal code
        octal += bin_oct_map[bin[i:i + 3]]
        i += 3
        if (i == len(bin)):
            break
             
        # if '.' is encountered add it to result
        if (bin[i] == '.'):
            octal += '.'
            i += 1
             
    # required octal number
    return octal
 
# Driver Code
bin = "1111001010010100001.010110110011011"
print("Octal number = ",
       convertBinToOct(bin))
 
# This code is contributed
# by Atul_kumar_Shrivastava

C#

// C# implementation to convert a
// binary number to octal number
 
using System;
using System.Collections.Generic;
 
public class GFG{
 
// Function to create map between binary
// number and its equivalent hexadecimal
static void createMap(Dictionary<String, char> um)
{
    um.Add("000", '0');
    um.Add("001", '1');
    um.Add("010", '2');
    um.Add("011", '3');
    um.Add("100", '4');
    um.Add("101", '5');
    um.Add("110", '6');
    um.Add("111", '7');
}
 
// Function to find octal equivalent of binary
static String convertBinToOct(String bin)
{
    int l = bin.Length;
    int t = bin.IndexOf('.');
    int i = 0;
    // 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 3
    for(i = 1;
            i <= (3 - len_left % 3) % 3;
            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 3
        for(i = 1;
                i <= (3 - len_right % 3) % 3;
                i++)
            bin = bin + '0';
    }
 
    // Create map between binary and its
    // equivalent octal code
    Dictionary<String,
        char> bin_oct_map = new Dictionary<String,
                                             char>();
    createMap(bin_oct_map);
 
    i = 0;
    String octal = "";
 
    while (true)
    {
         
        // One by one extract from left, substring
        // of size 3 and add its octal code
        octal += bin_oct_map[
            bin.Substring(i,  3)];
        i += 3;
         
        if (i == bin.Length)
            break;
 
        // If '.' is encountered add it to result
        if (bin[i] == '.')
        {
            octal += '.';
            i++;
        }
    }
 
    // Required octal number
    return octal;
}
 
// Driver code
public static void Main(String[] args)
{
    String bin = "1111001010010100001.010110110011011";
    Console.WriteLine("Octal number = " +
                        convertBinToOct(bin));
}
}
 
// This code is contributed by 29AjayKumar

Javascript

<script>
 
// Javascript implementation to convert a
// binary number to octal number
 
// Function to create map between binary
// number and its equivalent hexadecimal
function createMap(um)
{
    um.set("000", '0');
    um.set("001", '1');
    um.set("010", '2');
    um.set("011", '3');
    um.set("100", '4');
    um.set("101", '5');
    um.set("110", '6');
    um.set("111", '7');
}
 
// Function to find octal equivalent of binary
function convertBinToOct(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 3
    for(let i = 1;
            i <= (3 - len_left % 3) % 3;
            i++)
        bin = '0' + bin;
 
    // 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 3
        for(let i = 1;
                i <= (3 - len_right % 3) % 3;
                i++)
            bin = bin + '0';
    }
 
    // Create map between binary and its
    // equivalent octal code
    let bin_oct_map = new Map();
 
    createMap(bin_oct_map);
 
    let i = 0;
    let octal = "";
 
    while (true)
    {
         
        // One by one extract from left, substring
        // of size 3 and add its octal code
        octal += bin_oct_map.get(bin.substr(i, 3));
        i += 3;
 
        if (i == bin.length)
            break;
 
        // If '.' is encountered add it to result
        if (bin.charAt(i) == '.')
        {
            octal += '.';
            i++;
        }
    }
 
    // Required octal number
    return octal;
}
 
// Driver code
let bin = "1111001010010100001.010110110011011";
document.write("Octal number = " +
               convertBinToOct(bin));
 
// This code is contributed by gfgking
 
</script>

Producción:  

Octal number = 1712241.26633

Complejidad de tiempo: O(n), donde n es la longitud de la string.

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 *