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