You are here:

C++/how to convert binary to hex (c++) and other questions as well

Advertisement


Question
Hello.

I really need some help on c++. This is my first time using it and i get confused.

Here are my questions:

1.) how would you convert a binary to hexadecimal.
im getting a string input. eg. (10010001) as a string. i accept up to 32 bit.

2.) How would you convert a uintvar value from the user to decimal.

This is the algorithm but i dont get it.

To decode a uintvar into a decimal/integer:
discard MSB of each byte  and concatenate all reamaining 7 bits of each byte. find the integer value represented by the resulting binary number. Note that the last of the iput bytes have their MSBs set to 1. while the last byte its MSB is 0.

example output:

8a5c: 1372
8102: 130
9a81: 0
7f:   127

This is basically the reverse of this :

http://en.allexperts.com/q/C-1040/2010/10/converting-hex-uintvar.htm


Thanks. Help is much appreciated.

Answer
To deal with bits (numbers to strings of 0's and 1's etc) use std::bitset<>
http://en.cppreference.com/w/cpp/utility/bitset

To convert anything from or to a string use std::istringstream / std::ostringstream.
http://www.artima.com/cppsource/streamstrings.html

#include <iostream>
#include <string>
#include <bitset>
#include <sstream>
#include <algorithm>

std::string binary_to_hex( const std::string& bits )
{
   constexpr std::size_t MAX_BITS = 32 ;
   std::ostringstream stm ;
   stm << std::hex << std::bitset<MAX_BITS>( bits, 0, MAX_BITS ).to_ulong() ;
   return stm.str() ;
}

// get the least significant 7 bits in a byte
std::string seven_bits( const std::string& hex_byte )
{
   std::istringstream stm(hex_byte) ;
   unsigned int b ;
   stm >> std::hex >> b ;
   return std::bitset<8>(b).to_string().substr(1) ;
}

std::string uintvar_to_decimal( const std::string& uintvar )
{
   constexpr std::size_t MAX_BITS = 64 ;
   const std::size_t NBYTES = std::min( uintvar.size()/2, MAX_BITS/8 ) ;

   std::string bits ;

   for( std::size_t i = 0 ; i < NBYTES ; ++i ) // for each byte
       bits += seven_bits( uintvar.substr( i*2, 2 ) ) ; // add the 7 lsb to bits
   std::ostringstream stm ;
   stm << std::bitset<MAX_BITS>(bits).to_ullong() ; // convert to decimal number
   return stm.str() ;
}

int main()
{
   const std::string bits = "1111111100010010001101001011" ;
   std::cout << binary_to_hex(bits) << '\n' ;

   const std::string uintvar = "8a5c" ;
   std::cout << uintvar_to_decimal(uintvar) << '\n' ;
}

See: http://ideone.com/Ny1a1m

C++

All Answers


Answers by Expert:


Ask Experts

Volunteer


vijayan

Expertise

my primary areas of interest are generic and template metaprogramming, STL, algorithms, design patterns and c++11. i would not answer questions about gui and web programming.

Experience

about 15 years or so

Education/Credentials
post graduate engineer

©2016 About.com. All rights reserved.