Created
October 17, 2017 04:11
-
-
Save bexp/e419ab8829bccec70c5c94d2e7b6a004 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <vector> | |
#include <bitset> | |
#include <math.h> | |
#include <climits> | |
using namespace std; | |
/* | |
static string ToBinaryString(float value) { | |
int bitCount = sizeof(float) * 8; // never rely on your knowledge of the size | |
char[] result = new char[bitCount]; // better not use string, to avoid ineffective string concatenation repeated in a loop | |
// now, most important thing: (int)value would be "semantic" cast of the same | |
// mathematical value (with possible rounding), something we don't want; so: | |
int intValue = System.BitConverter.ToInt32(BitConverter.GetBytes(value), 0); | |
for (int bit = 0; bit < bitCount; ++bit) { | |
int maskedValue = intValue & (1 << bit); // this is how shift and mask is done. | |
if (maskedValue > 0) | |
maskedValue = 1; | |
// at this point, masked value is either int 0 or 1 | |
result[bitCount - bit - 1] = maskedValue.ToString()[0]; // bits go right-to-left in usual Western Arabic-based notation | |
} | |
return new string(result); // string from character array | |
} | |
*/ | |
void print(int* arr, int n) { | |
for (int i =0;i<n;i++) { | |
cout << arr[i] << " "; | |
} | |
cout << endl; | |
} | |
void permuate(int* arr, int size, int n) { | |
if (size == 1) { | |
print(arr, n); | |
} else { | |
for( int i = 0; i< size; i++) { | |
permuate(arr, size - 1, n); | |
cout << "i = " << i << " n = " << size << endl; | |
if (size%2==1) | |
swap(arr[0], arr[size-1]); | |
else | |
swap(arr[i], arr[size-1]); | |
} | |
} | |
} | |
void permute(int a[], int i, int n) | |
{ | |
int j; | |
cout << "permute " << i << endl; | |
if (i == n) | |
print(a, n); | |
else | |
{ | |
for (j = i; j < n; j++) | |
{ | |
swap(a[i], a[j]); | |
cout << "swap i = " << i << " j = " << j << endl; | |
permute(a, i+1, n); | |
swap(a[i], a[j]); | |
} | |
cout << "exit " << i << endl; | |
} | |
} | |
// Convert the 32-bit binary encoding into hexadecimal | |
int Binary2Hex( std::string Binary ) | |
{ | |
std::bitset<32> set(Binary); | |
int hex = set.to_ulong(); | |
return hex; | |
} | |
string GetBinaryFloat(float flo) { | |
int integral = flo; | |
float fraction = flo - integral; | |
int shift = 0; | |
uint32_t mantissa = 0; | |
while(integral > 0) { | |
if (integral % 2 != 0) { | |
mantissa |= 1 << shift; | |
} | |
integral >>= 1; | |
shift++; | |
} | |
uint32_t exponent = 127 + shift -1; | |
cout << exponent << endl; | |
cout << mantissa << endl; | |
cout << bitset<32>(mantissa).to_string() << endl; | |
mantissa = mantissa & ~(1 << (shift - 1)); | |
cout << mantissa << endl; | |
cout << bitset<32>(mantissa).to_string() << endl; | |
while (fraction > 0) { | |
fraction *= 2; | |
if ((int)fraction > 0) { | |
fraction -=1; | |
mantissa = (mantissa << 1) ^1 ; | |
} else { | |
mantissa = (mantissa << 1); | |
} | |
shift++; | |
} | |
mantissa = mantissa << (32 - (shift -1) - 9); | |
uint32_t ieee745 = (exponent << 23 ) | mantissa; | |
cout << bitset<32>(ieee745).to_string() << endl; | |
float cross = *(float*)&ieee745; | |
cout << "shift " << mantissa << endl; | |
cout << "cross " << cross << endl; | |
return to_string(shift); | |
} | |
// Convert the 32-bit binary into the decimal | |
float GetFloat32( std::string Binary ) | |
{ | |
int HexNumber = Binary2Hex( Binary ); | |
bool negative = (HexNumber >> 31) != 0; | |
int exponent = (HexNumber >> 23) & 0xFF; | |
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 = 9; i < 32; i++ ) | |
{ | |
int c = Binary[ i ] - '0'; | |
total += (float) c * (float) pow( 2.0, power ); | |
power--; | |
} | |
total += 1.0; | |
float value = sign * (float) pow( 2.0, exponent ) * total; | |
return value; | |
} | |
// Get 32-bit IEEE 754 format of the decimal value | |
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(); | |
return mystring; | |
} | |
// To execute C++, please define "int main()" | |
int main() { | |
///int arr[] = { 1, 2, 3}; | |
//permute(arr, 0, 3); | |
// Convert 19.5 into IEEE 754 binary format.. | |
string str = GetBinary32( (float) 210.15 ); | |
cout << "Binary equivalent of 210:" << std::endl; | |
cout << str << std::endl << std::endl; | |
// .. and back again | |
float f = GetFloat32( str ); | |
cout << "Decimal equivalent of " << str << ":" << std::endl; | |
cout << f << std::endl; | |
//int power = -1; | |
//cout << pow( 1.0, power ) << endl; | |
cout << GetBinaryFloat(210.125) << endl; | |
return 0; | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment