1

32ビットは、IEEE形式を使用してバイナリで表されます。では、どうすればそれらのビットを抽出できますか?&や|のようなビット演算 それらに取り組んではいけません!私が基本的にやりたいのは、opencv thanxの32ビットfloatイメージからLSBを事前に抽出することです!

4

4 に答える 4

4
uint32_t get_float_bits(float f) {
    assert(sizeof(float) == sizeof(uint32_t)); // or static assert
    uint32_t bits;
    memcpy(&bits, &f, sizeof f);
    return bits;
}

C99の時点で、標準はユニオントリックが機能することを保証し(サイズが一致する場合)、実装は通常、必要になる前でもそれを保証しています。個人的には、人々が何を見ているのかわかりません。私はこれが好きです。

LSBだけが必要で、エンディアンがわかっている場合は、フロートの1バイトだけに直接アクセスできます。これmemcpyには、ユニオンや厳密なエイリアシングの違反はありません。

int lsb = ((unsigned char*)&f)[0] & 1; // little-endian
int lsb = ((unsigned char*)&f)[sizeof(float)-1] & 1; // big-endian
于 2012-06-21T11:02:07.647 に答える
4

ユニオンを使用して値を安全に引き出すことができます(デモ):

union fi_t
{
    unsigned int i;
    float f;
};

fi_t fi;
fi.f = 1.5;
unsigned int i = fi.i;

(型キャストしないでください。これにより、恐ろしいが呼び出さftolれます。これは、SSE2を使用して整数形式に変換する場合があります。またはFISTP、後のIEEEビットを生成しません)

于 2012-06-21T10:53:36.267 に答える
1

古いトリック:

float num = 0.5;
uint32_t binary_representation = *(uint32_t *)#
于 2012-06-21T10:43:22.363 に答える
1
#include<stdio.h>
union abc
{
    float fo;
    unsigned int no;
};
int main()
{   
    union abc test;
    test.fo=36.5;
    unsigned int x=test.no;
    for( int i = 0; i < sizeof(float)*8; i++ )
    {
        printf("%d", x & 0x1);
        x = x >> 1;
    }

    return 0;
}

これはフロートのビットを抽出する方法でした!

于 2012-07-06T14:48:45.833 に答える