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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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
1 2 3 4 5 6 | int Bin2Hex( std::string Binary ) { std::bitset<64> set(Binary); int hex = set.to_ulong(); return hex; } |
Binary string to hexadecimal string
1 2 3 4 5 6 7 8 9 10 11 | #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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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
1 2 3 4 5 6 | long Bin2Dec( std::string bin ) { char * ptr; long parsed = strtol ( bin.c_str(), & ptr, 2 ); return parsed; } |
Integer value to binary string
1 2 3 4 5 6 7 8 9 10 11 12 | 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
1 2 3 4 5 | int IntStr2Int( std::string intstr ) { int value = atoi ( intstr.c_str() ); return value; } |
Integer array to integer string
1 2 3 4 5 6 7 8 9 10 11 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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
1 2 3 4 5 6 7 8 9 | void dec2base( int num, int base, std::stringstream& ss ) { if (num >= base) { dec2base(num/base, base, ss ); } ss << num % base; } |
Double to binary32
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | 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
1 2 3 4 5 6 7 8 9 10 11 12 | 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^
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | // 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); } |