2013-02-13 85 views
2

所以我需要編寫一個方法來實現這一難題:Ç按位邏輯操作益智

float_f2i

  • 返回位級等效表達式(INT)的f表示浮點參數F。

  • 參數作爲unsigned int傳遞,但它被解釋爲單精度浮點值的位級 表示。

  • 任何超出範圍(包括的NaN和無窮大)應返回0x80000000u。

所以我拿出來的是,我給了一個十六進制的數字,我必須編寫代碼把它放在整數格式中。給我們的測試案例是; Argument [0x00800000], returns [0x0]因爲0x00800000是1.1754 .... E-38,小到可以返回值爲0(所以我假設)

我至今是:

int float_f2i(unsigned uf) { 
    unsigned sign = uf & (0x80000000); 
    unsigned exp = uf >> 23 & 0xff; 
    unsigned frac = uf & 0x7fffff; 

    //takes care of NaN and inifinity 
    if (exp == 255) {return 0x80000000u;} 


    if ((exp > 0) && (exp < 255)) //normalized 
    { 
    if ((sign >> 28) == 0x0) //if sign bit is 0 
    { 
     return (0x1); //NEEDS MORE HERE 
    } 
    else if ((sign >> 28) == 0x8) //if sign bit is 1 
    { 
     return (0x8); //NEEDS MORE HERE 
    } 
    } 
    else if (exp == 0)//denormalized 
    { 
    return 0; // rounds to zero anyway 
    } 
} 

我知道這個爲了工作,我必須在返回語句的指數部分添加(1.frac ^(exp-127)),但我不知道如何對其進行編碼。左移兩位,而對於負指數2,我需要向右移動,但>>操作符在算術上做了這個。我是否需要創建一個動態掩碼來關閉由算術移位創建的1位?

編輯:得到了一個答案,我會全錯了方向,備查如果任何人有這樣做:

int float_f2i(unsigned uf) { 
    int exponent = (uf >> 23) & 0ff; 
    int exp = exponent - 127; 
    int frac = uf & 0x7fffff; 

    if(exponent == 0x7F800000) 
    return 0x80000000u; 
    if(!exponent) 
    return 0; 
    if(exp < 0) 
    return 0; 
    if(exp > 30) 
    return 0x80000000u; 

    frac = frac | 0x800000; 
    if (exp >= 23) 
    frac = frac << (exp - 23); 
    else 
    frac = frac >> (23 - exp); 

    if((uf >> 31) & 1) 
    return ~frac + 1; 

    return frac; 
} 

回答

0

c只有一個右移操作>>但這只是一個算術移位時該號碼是一個有符號的值類型。

main() 
{ 
    int x = -2; 
    printf("%d\n",x>>1); 
    printf("%d\n",((unsigned int)x)>>1); 
    return 0; 
} 

Run it here

所以,如果你需要確保非算術移位,你可以轉換爲無符號。

+0

好的,謝謝......所以當時像0xbf080000(的-1.0625×2 ^(標準值 - 1))的說法我將不得不採取的價值,鑄就無符號,轉向正確除以2,再將它作爲簽名進行廣播,然後用適當的掩碼「或」來獲得否定的迴應? – chriszumberge 2013-02-13 13:55:58