3

フローティングデータ型のビットセットコンテナを使用できますか?例:

bitset<sizeof(float)*sizeof(char)> second(5.5f);
cout << second.to_string() << endl;

正しく動作しません。私がやろうとしているのは、ビット表現を取得することです。

4

2 に答える 2

8

bitsetunsigned longコンストラクター引数としてのみを取ります。あなたの例では、floatはに変換unsigned longされ、引数として使用されます。

あなたが望むものを手に入れるために、次の線に沿って何かを使用してください:

float f = 5.5f;
std::bitset<sizeof(float)*CHAR_BIT> foo(*reinterpret_cast<unsigned long*>(&f));

これは、floatが入っている「メモリ」を、コンストラクタを含むメモリとして再解釈しunsigned long、コンストラクタを「トリック」します。

于 2011-09-23T19:30:56.750 に答える
2

明確に定義された方法でbitsetからを構築するには、次のことを行う必要があります。float

  1. タイプに互換性のあるサイズがあることを確認してください。
  2. floatあなたの表現を互換性のある整数にコピーします。
  3. 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";
}

ライブデモ

于 2018-01-19T15:22:58.447 に答える