所以我需要編寫一個方法來實現這一難題:Ç按位邏輯操作益智
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;
}
好的,謝謝......所以當時像0xbf080000(的-1.0625×2 ^(標準值 - 1))的說法我將不得不採取的價值,鑄就無符號,轉向正確除以2,再將它作爲簽名進行廣播,然後用適當的掩碼「或」來獲得否定的迴應? – chriszumberge 2013-02-13 13:55:58