簡體   English   中英

從C中的32位浮點數中提取位

[英]extract bits from 32 bit float numbers in C

使用IEEE格式以二進制表示32位。 那么如何提取這些位呢? &和|之類的按位運算 不要對他們工作! 我基本上想做的是提前從opencv thanx中的32位浮點圖像中提取LSB!

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

您可以使用聯合安全地提取值( 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位)

老把戲:

float num = 0.5;
uint32_t binary_representation = *(uint32_t *)#
#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;
}

這是一種提取浮點數的方法!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM