From 3bdc28799718dc7d3d92b0f617f0ad45f638b1d7 Mon Sep 17 00:00:00 2001 From: Sandipan Mohanty <s.mohanty@fz-juelich.de> Date: Sun, 8 May 2022 20:41:23 +0200 Subject: [PATCH] C++17 compatible binform for use in notebooks --- code/include/binform17.hh | 49 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 code/include/binform17.hh diff --git a/code/include/binform17.hh b/code/include/binform17.hh new file mode 100644 index 0000000..d52ff9f --- /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"; +} + +} + -- GitLab