2013-02-13 62 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