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); }