Number System Conversions in C++

A posting which I will probably update from time to time that summarizes the conversion functions I encounter in C++. Hope others will find this useful too.

32-bit IEEE 754 floating point value to binary string

std::string GetBinary32( float value )
{
	union
    {
         float input;   // assumes sizeof(float) == sizeof(int)
         int   output;
    }    data;

	data.input = value;

	std::bitset<sizeof(float) * CHAR_BIT>   bits(data.output);

	std::string mystring = bits.to_string<char, 
		                                  std::char_traits<char>,
										  std::allocator<char> >();

	return mystring;
}

32-bit IEEE 754 binary string to floating point value

float GetFloat32( std::string Binary )
{
	int HexNumber = Binary2Hex( Binary );

	bool negative  = !!(HexNumber & 0x80000000);
	int  exponent  =   (HexNumber & 0x7f800000) >> 23;	
	int sign = negative ? -1 : 1;

	// Subtract 127 from the exponent
	exponent -= 127;

	// Convert the mantissa into decimal using the
	// last 23 bits
	int power = -1;
	float total = 0.0;
	for ( int i = 0; i < 23; i++ )
	{
		int c = Binary[ i + 9 ] - '0';
		total += (float) c * (float) pow( 2.0, power );
		power--;
	}
	total += 1.0;

	float value = sign * (float) pow( 2.0, exponent ) * total;

	return value;
}

Binary string to hexadecimal value

int Bin2Hex( std::string Binary )
{
	std::bitset<64> set(Binary);		
	int hex = set.to_ulong();	
	return hex;
}

Binary string to hexadecimal string

#include <sstream>

std::string Binary2HexString( std::string Binary )
{
	std::bitset<64> set(Binary);		
	int hex = set.to_ulong();

	std::stringstream hex_str;
	hex_str << std::hex << std::uppercase << hex;	
	return hex_str.str();
}

Integer value to Gray code

std::string Dec2Gray( unsigned n )
{
	n = (n>>1) ^ n;

	const size_t size = sizeof(n) * 8;
    char result[size];

    unsigned index = size;
    do 
	{
        result[--index] = '0' + (n & 1);
    } while (n >>= 1);

    return std::string(result + index, result + size);
}

Gray string to binary string

std::string Gray2Bin( std::string gray )
{
	int len = gray.length();
	
	std::string bin = gray;		

	for ( int i = len - 2; i >= 0; i-- )
	{
		int bk = bin.at( i + 1 ) - '0';
		int gi = gray.at( i + 1 ) - '0';

		if ( bk == 0 )
		{
			bin[ i ] = gi == 1 ? '1' : '0';
		}
		else
		{
			bin[ i ] = gi == 1 ? '0' : '1';
		}	
	}
	
	return bin;
}

Binary string to integer value

long Bin2Dec( std::string bin )
{
	char * ptr;
    long parsed = strtol( bin.c_str(), & ptr, 2 );
	return parsed;
}

Integer value to binary string

std::string Dec2Bin( unsigned n )
{
    const size_t size = sizeof(n) * 8;
    char result[size];

    unsigned index = size;
    do {
        result[--index] = '0' + (n & 1);
    } while (n >>= 1);

    return std::string(result + index, result + size);
}

Integer string to integer value

int IntStr2Int( std::string intstr )
{
	int value = atoi( intstr.c_str() );
	return value;
}

Integer array to integer string

std::string IntArray2String( int int_array[], int size )
{
	std::stringstream ss;
 
	for (int i = 0; i < size; i++)
	{
		ss << int_array[i];
	}
 
	return ss.str();
}

Integer to integer array

int* Int2IntArray( unsigned value )
{
	// Number of digits
	int size = value % 10;
	int val = size;

	int *arr = new int[ size ];
	int i = size - 1;

	while( i >= 0 )
	{
		arr[ i ] = val;
		value /= 10;
		val = value % 10;
		i--;
	}	
 
	return arr;
}

Decimal to any base

void dec2base(int num, int base, std::stringstream& ss ) 
{
   if (num >= base) 
   {  
	   dec2base(num/base, base, ss ); 
   }
       
   ss << num % base;
}

Double to binary32

int DoubleToBinary32(double value)
{
  int minus = 0, integer, exponent = 127, fraction = 0, i, result;

  if(value < 0) { minus = 0x80000000; value = -value; }
  integer = floor(value);
  value -= integer;
  for(i = 22; i >= 0; i--)
    {
    value += value;
    fraction += floor(value) * pow(2, i);
    value -= floor(value);
    }
  while((integer != 1) && (exponent > 0) && (exponent < 255))
    {
    if(integer > 1)
      {
      fraction = (integer&1)<<22 + fraction>>1;
      integer = integer>>1;
      exponent++;
      }
    else
      {
      integer = (fraction&0x400000)>>22;
      fraction = (fraction&0x3FFFFF)<<1;
      value += value;
      fraction += floor(value);
      value -= floor(value);
      exponent--;
      }
    }
  result = minus + exponent<<23 + fraction;
  return(result);
}

Binary32 to double

double Binary32ToDouble(int value)
{
  int minus = -1, exponent;
  double fraction, result;

  if(value&0x80000000 == 0) minus = 1;
  exponent = ((value&0x7F800000)>>23) - 127;
  fraction = value&0x7FFFFF + 0x800000;
  fraction = fraction / 0x800000;
  result = minus * fraction * pow(2, exponent);
  return(result);
}

std::bitset to System::String^

// Compiled as a CLR empty project in Visual Studio
#include <bitset>
#include <iostream>
#include <string>

using namespace System;
const unsigned int number_elements = 5;

template<unsigned int N>
System::String^ GetBitsetString( std::bitset< N > bset )
{
	std::string str =  
	   bset.template to_string<char, 
	                           std::char_traits<char>, 
							   std::allocator<char> >();

	return gcnew String(str.c_str());  
}

int main( )
{      
   std::bitset<number_elements> bits( std::string( "10101" ) );   
   String^ str2 = GetBitsetString( bits );   
   Console::WriteLine(str2);  
}

Latest Comments

  1. ahmed 21 December 2012
    • Andy 21 December 2012

Leave a Reply to Andy Cancel reply