从C中的32位浮点数中提取位

时间:2012-06-21 10:42:27

标签: c opencv floating-point bit-manipulation ieee-754

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

4 个答案:

答案 0 :(得分: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,并且你知道字节序,你可以直接访问浮点数的一个字节,没有任何memcpy或者union,或者违反严格的别名。

int lsb = ((unsigned char*)&f)[0] & 1; // little-endian
int lsb = ((unsigned char*)&f)[sizeof(float)-1] & 1; // big-endian

答案 1 :(得分:3)

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

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

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

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

答案 2 :(得分:1)

老技巧:

float num = 0.5;
uint32_t binary_representation = *(uint32_t *)#

答案 3 :(得分: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;
}

这是一种提取浮点数的方法!