Как преобразовать неподписанное int в число с плавающей точкой?

Мне нужно построить функцию, которая возвращает битовый эквивалент (float) x без использования каких-либо плавающих типов данных, операций или констант. Я думаю, что у меня есть, но когда я запускаю тестовый файл, он возвращает, что есть бесконечный цикл. Любая помощь отладки будет принята с благодарностью.

Мне разрешено использовать любые целочисленные / беззнаковые операции, включая ||, &&, если, while. Кроме того, я могу использовать только 30 операций

unsigned float_i2f(int x) {
    printf("\n%i", x);
    if (!x) {return x;}
    int mask1 = (x >> 31);
    int mask2 = (1 << 31);
    int sign = x & mask2;
    int complement = ~x + 1;
    //int abs = (~mask1 & x) + (mask1 & complement);
    int abs = x;
    int i = 0, temp = 0;
    while (!(temp & mask2)){
        temp = (abs <<i);
        i = i + 1;
    }
    int E = 32 - i;
    int exp = 127 + E;
    abs = abs & (-1 ^ (1 << E));
    int frac;
    if ((23 - E)>0)
        frac = (abs << (23 - E));
    else
        frac = (abs >> (E - 23));
    int rep = sign + (exp << 23) + frac;
    return rep;
}

В ответ на очень полезные комментарии и ответы, вот обновленный код, который теперь работает только для 0x80000000:

unsigned float_i2f(int x) {
    int sign;
    int absX;
    int E = -1;
    int shift;
    int exp;
    int frac;
    // zero is the same in int and float:
    if (!x) {return x;}

    // sign is bit 31: that bit should just be transferred to the float:
    sign = x & 0x80000000;

    // if number is < 0, take two's complement:
    if (sign != 0) {
        absX = ~x + 1;
    }
    else
        absX = x;

    shift = absX;
    while ((!!shift) && (shift != -1)) {
        //std::cout << std::bitset<32>(shift) << "\n";
        E++;
        shift = (shift >> 1);
    }
    if (E == 30) { E++;}
    exp = E + 127+24;
    exp = (exp << 23);
    frac = (absX << (23 - E)) & 0x007FFFFF;
    return sign + exp + frac;
}

Кто-нибудь есть идеи, где ошибка в пересмотренном коде? Спасибо всем еще раз!

Ответы на вопрос(3)

Ваш ответ на вопрос