diff --git a/code/include/binform17.hh b/code/include/binform17.hh new file mode 100644 index 0000000000000000000000000000000000000000..d52ff9f5c779014322002c6b7eb1cba409469a76 --- /dev/null +++ b/code/include/binform17.hh @@ -0,0 +1,49 @@ +#include <iostream> +#include <bitset> +#include <cstddef> +#include <iomanip> + +namespace cxx2022 { +using byte = unsigned char; + +template <class T> +auto bits(T var) +{ + std::remove_cv_t<std::remove_reference_t<T>> loc{var}; + unsigned long bytes{0UL}; + byte* in = reinterpret_cast<byte *>(&loc); + byte* out = reinterpret_cast<byte *>(&bytes); + std::copy(in, in + sizeof(loc), out); + return std::bitset<8*sizeof(decltype(loc))>(bytes) ; +} + +void showbits(double var) +{ + std::cout << "bits for double value " << var << "\n"; + auto b = bits(var).to_string(); + std::cout << "raw = " << b << "\n"; + std::cout << "sign exponent mantissa\n" + << std::setw(6) << std::left << b[0] + << std::setw(16) << std::left << b.substr(1UL, 11) + << " " << b.substr(12) << "\n\n"; +} + +void showbits(float var) +{ + std::cout << "bits for float value " << var << "\n"; + auto b = bits(var).to_string(); + std::cout << "raw = " << b << "\n"; + std::cout << "sign exponent mantissa\n" + << std::setw(6) << std::left << b[0] + << std::setw(16) << std::left << b.substr(1UL, 8) + << " " << b.substr(9) << "\n\n"; +} + +template <class T> +void showbits(T var) +{ + std::cout << "bits for " << var << " with non-floating point type : " << bits(var) << "\n"; +} + +} +