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