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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| #include <iostream>
#include <climits>
#include <cfloat>
template <typename T>
std::string toBitGroup(T const& value, int bitPerGroup)
{
static int const maxResultSize = sizeof(T)*CHAR_BIT + 1;
char result[maxResultSize];
unsigned char const* raw = reinterpret_cast<unsigned char const*>(&value);
unsigned char carry = 0;
int bitsInCarry = 0;
int resIndex = maxResultSize;
result[--resIndex] = '\0';
for (int rawIndex = sizeof(T)-1; rawIndex >= 0; --rawIndex) {
while (bitsInCarry + CHAR_BIT >= bitPerGroup) {
if (bitsInCarry >= 0)
carry |= raw[rawIndex] << bitsInCarry;
else
carry |= raw[rawIndex] >> -bitsInCarry;
result[--resIndex]
= "0123456789ABCDEF"[carry & 0xF & (~(0xF << bitPerGroup))];
carry >>= bitPerGroup;
bitsInCarry -= bitPerGroup;
}
bitsInCarry += CHAR_BIT;
}
if (bitsInCarry > 0) {
result[--resIndex]
= "0123456789ABCDEF"[carry & 0xF & (~(0xF << bitPerGroup))];
}
return result+resIndex;
}
int main(int argc, char *argv[]) {
std::cout << toBitGroup((double)0.0, 4) << '\n';
std::cout << toBitGroup((double)DBL_MIN, 4) << '\n';
std::cout << toBitGroup((double)-DBL_MIN, 4) << '\n';
std::cout << toBitGroup((double)0.125, 4) << '\n';
std::cout << toBitGroup((double)-0.125, 4) << '\n';
std::cout << toBitGroup((double)0.25, 4) << '\n';
std::cout << toBitGroup((double)-0.25, 4) << '\n';
std::cout << toBitGroup((double)0.5, 4) << '\n';
std::cout << toBitGroup((double)-0.5, 4) << '\n';
std::cout << toBitGroup((double)1.0-DBL_EPSILON, 4) << '\n';
std::cout << toBitGroup((double)1.0, 4) << '\n';
std::cout << toBitGroup((double)1.0+DBL_EPSILON, 4) << '\n';
std::cout << toBitGroup((double)2.0, 4) << '\n';
std::cout << toBitGroup((double)4.0, 4) << '\n';
std::cout << toBitGroup((double)0xFF6E5D+(double)0x9876543/0x20000000, 4) << '\n';
std::cout << toBitGroup((double)DBL_MAX, 4) << '\n';
std::cout << toBitGroup((double)-DBL_MAX, 4) << '\n';
} |
Partager