1

32 位使用 IEEE 格式以二进制表示。那么我怎样才能提取这些位呢?& 和 | 等按位运算 不要对他们工作!我基本上想做的是提前从opencv thanx中的32位浮点图像中提取LSB!

4

4 回答 4

4

您可以使用联合来安全地提取值(演示):

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

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

(只是从不进行类型转换,这将调用 dreaded ftol,它可能使用 SSE2 转换为整数形式,或者FISTP,它不会产生您所追求的 IEEE 位)

于 2012-06-21T10:53:36.267 回答
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,并且您知道字节序,则可以直接访问 float 的一个字节,而无需任何memcpy、 或 union 或违反严格别名。

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 回答
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 回答
1

老套路:

float num = 0.5;
uint32_t binary_representation = *(uint32_t *)&num;
于 2012-06-21T10:43:22.363 回答