Open In App

Program to convert a binary number to octal

Last Updated : 05 Dec, 2023
Suggest changes
Share
Like Article
Like
Report

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: 

  1. Get length of substring to the left and right of the decimal point(‘.’) as left_len and right_len.
  2. 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.
  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.
  4. Now, from the left extract one by one substrings of length 3 and add its corresponding octal code to the result.
  5. If in between a decimal(‘.’) is encountered then add it to the result.
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> 

Output
Octal number = 1712241.26633


Time Complexity: O(n), where n is the length of string.
Auxiliary Space: O(1)


 


Similar Reads