Поэтому мне нужно написать метод, чтобы выполнить эту загадку:C Битовые Логические Операции Логические
float_f2i
Возврат бита уровня эквивалента выражения (INT) ф с плавающей точкой аргумент ф.
Аргумент передается как unsigned int, но его следует интерпретировать как представление уровня значения с плавающей точкой с одной точностью.
Все, что выходит за пределы допустимого диапазона (включая NaN и бесконечность), должно возвращать 0x80000000u.
Так что я взял из этого, что мне дали число в шестнадцатеричном виде, и мне нужно написать код, чтобы поместить его в целочисленный формат. Испытуемый, предоставленный нам, был; 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, Мне нужно было бы сдвинуть вправо, но оператор >> делает это арифметически. Нужно ли создавать динамическую маску, чтобы убить 1 бит, созданный арифметическим сдвигом?
EDIT: Получил ответ, и я собирался все неверное направление, в будущем ссылки, если кто-то должен это сделать:
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 x 2^(- 1)), мне нужно было бы принять значение, -cast его как подписанный, затем 'OR' с соответствующей маской, чтобы получить отрицательный ответ? – chriszumberge