2013-02-13 5 views
2

Поэтому мне нужно написать метод, чтобы выполнить эту загадку: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; 
} 

ответ

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 x 2^(- 1)), мне нужно было бы принять значение, -cast его как подписанный, затем 'OR' с соответствующей маской, чтобы получить отрицательный ответ? – chriszumberge

Смежные вопросы