したがって、このパズルを満たすメソッドを作成する必要があります。
float_f2i
浮動小数点引数 f の式 (int) f に相当するビットレベルを返します。
引数は unsigned int として渡されますが、単精度浮動小数点値のビットレベル表現として解釈されます。
範囲外 (NaN および無限大を含む) は、0x80000000u を返す必要があります。
ここから得たのは、16 進数の数値が与えられ、それを整数形式にするコードを書かなければならないということです。私たちに与えられたテストケースは次のとおりです。
Argument [0x00800000], returns [0x0]
0x00800000 は 1.1754....E-38 であるため、ゼロとして返されるほど小さい (だから私は仮定している)
私がこれまでに持っているものは次のとおりです。
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
}
}
これが機能するには、return ステートメント (1.frac^(exp-127)) に指数部分を追加する必要があることはわかっていますが、それをコーディングする方法がわかりません。左にシフトすると 2 倍になりますが、 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;
}