所以我需要编写一个方法来实现这一难题:Ç按位逻辑操作益智
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