フローティングデータ型のビットセットコンテナを使用できますか?例:
bitset<sizeof(float)*sizeof(char)> second(5.5f);
cout << second.to_string() << endl;
正しく動作しません。私がやろうとしているのは、ビット表現を取得することです。
フローティングデータ型のビットセットコンテナを使用できますか?例:
bitset<sizeof(float)*sizeof(char)> second(5.5f);
cout << second.to_string() << endl;
正しく動作しません。私がやろうとしているのは、ビット表現を取得することです。
bitset
unsigned long
コンストラクター引数としてのみを取ります。あなたの例では、float
はに変換unsigned long
され、引数として使用されます。
あなたが望むものを手に入れるために、次の線に沿って何かを使用してください:
float f = 5.5f;
std::bitset<sizeof(float)*CHAR_BIT> foo(*reinterpret_cast<unsigned long*>(&f));
これは、floatが入っている「メモリ」を、コンストラクタを含むメモリとして再解釈しunsigned long
、コンストラクタを「トリック」します。
明確に定義された方法でbitset
からを構築するには、次のことを行う必要があります。float
float
あなたの表現を互換性のある整数にコピーします。bitset
その整数からを構築します。最小限の例を次に示します。
#include <bitset>
#include <cstring>
float f = 1.618;
static_assert(sizeof(float) <= sizeof(long long unsigned int), "wrong sizes"); // 1.
long long unsigned int f_as_int = 0;
std::memcpy(&f_as_int, &f, sizeof(float)); // 2.
std::bitset<8*sizeof(float)> f_as_bitset{f_as_int}; // 3.
long long unsigned int
ただし、これは、より大きいエンディアンターゲットでは期待どおりに機能しません。これは、ビットfloat
セットコンストラクターが、エンディアンに関係なく、引数の最下位ビットを常に選択するためです。そして、これは最悪です。
したがって、完全にしたい場合は、これに対処する必要があります。これを行うには、floatを同じサイズ(2.)の整数にコピーし、それを(3.)にキャストlong long unsigned int
して、エンディアンにとらわれない表現を作成します。しかし、ええ、エンディアンにとらわれない解決策は退屈です:
#include <bitset>
#include <cstring>
#include <cstdint>
#include <iostream>
namespace details
{
template<unsigned nbits> struct uint {};
template<> struct uint<8> { using type = uint8_t; };
template<> struct uint<16> { using type = uint16_t; };
template<> struct uint<32> { using type = uint32_t; };
template<> struct uint<64> { using type = uint64_t; };
}
template<class T>
using unsigned_integer_of_same_size = typename details::uint<sizeof(T)*8>::type;
int main()
{
float f = -1./0.;
static_assert(sizeof(float) <= sizeof(long long unsigned int), "wrong sizes"); // 1.
unsigned_integer_of_same_size<float> f_as_uint = 0;
std::memcpy(&f_as_uint, &f, sizeof(float)); // 2.
std::bitset<8*sizeof(float)> f_as_bitset{f_as_uint}; // 3. && 4.
std::cout << f_as_bitset << "\n";
}
(ライブデモ)