Convert a binary number to octal - GeeksforGeeks

17 Dec, 2021
The problem is to convert the given binary number (represented as string) to its equivalent octal number. The input could be very large and may not fit even into unsigned long long int.
Examples:  
Input : 110001110
Output : 616

Input  : 1111001010010100001.010110110011011
Output : 1712241.26633 
The idea is to consider the binary input as a string of characters and then follow the steps: 
Get length of substring to the left and right of the decimal point(‘.’) as left_len and right_len.If left_len is not a multiple of 3 add min number of 0’s in the beginning to make length of left substring a multiple of 3.If right_len is not a multiple of 3 add min number of 0’s in the end to make length of right substring a multiple of 3.Now, from the left extract one by one substrings of length 3 and add its corresponding octal code to the result.If in between a decimal(‘.’) is encountered then add it to the result.
Get length of substring to the left and right of the decimal point(‘.’) as left_len and right_len.
If left_len is not a multiple of 3 add min number of 0’s in the beginning to make length of left substring a multiple of 3.
If right_len is not a multiple of 3 add min number of 0’s in the end to make length of right substring a multiple of 3.
Now, from the left extract one by one substrings of length 3 and add its corresponding octal code to the result.
If in between a decimal(‘.’) is encountered then add it to the result.
C++
Java
Python3
C#
Javascript
// 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 octalvoid 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 binarystring 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 aboveint main(){    string bin = "1111001010010100001.010110110011011";    cout << "Octal number = "         << convertBinToOct(bin);    return 0;    } 
// Java implementation to convert a// binary number to octal numberimport java.io.*;import java.util.*; class GFG{ // Function to create map between binary// number and its equivalent hexadecimalstatic 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 binarystatic 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 codepublic static void main(String[] args){    String bin = "1111001010010100001.010110110011011";    System.out.println("Octal number = " +                        convertBinToOct(bin));}} // This code is contributed by jithin
# Python3 implementation to convert a binary number# to octal number # function to create map between binary# number and its equivalent octaldef 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 binarydef 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 Codebin = "1111001010010100001.010110110011011"print("Octal number = ",       convertBinToOct(bin)) # This code is contributed# by Atul_kumar_Shrivastava
// 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 hexadecimalstatic 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 binarystatic 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 codepublic static void Main(String[] args){    String bin = "1111001010010100001.010110110011011";    Console.WriteLine("Octal number = " +                        convertBinToOct(bin));}} // This code is contributed by 29AjayKumar
<script> // Javascript implementation to convert a// binary number to octal number // Function to create map between binary// number and its equivalent hexadecimalfunction 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 binaryfunction 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 codelet bin = "1111001010010100001.010110110011011";document.write("Octal number = " +               convertBinToOct(bin)); // This code is contributed by gfgking </script>
Output:  
Octal number = 1712241.26633
Time Complexity: O(n), where n is the length of string.
This article is contributed by Ayush Jauhari. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above. 
Atul_kumar_Shrivastava
jithin
gfgking
29AjayKumar
base-conversion
binary-representation
Bit Magic
Bit Magic
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Cyclic Redundancy Check and Modulo-2 Division
Little and Big Endian Mystery
Bits manipulation (Important tactics)
Bit Fields in C
Find the element that appears once
Add two numbers without using arithmetic operators
Set, Clear and Toggle a given bit of a number in C
Josephus problem | Set 1 (A O(n) Solution)
C++ bitset and its application
1's and 2's complement of a Binary Number