¿Cómo convertir un int sin signo a un flotador?

Necesito crear una función que devuelva el equivalente de nivel de bits de (float) x sin usar ningún tipo de datos, operaciones o constantes flotantes. Creo que lo tengo, pero cuando ejecuto el archivo de prueba, devuelve que hay un bucle infinito. Cualquier ayuda de depuración sería apreciada.

Se me permite usar cualquier operación de entero / sin signo, incluyendo ||, &&, if, while. Además, solo puedo usar 30 operaciones.

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;
}

En respuesta a los comentarios y respuestas muy útiles, aquí está el código actualizado, ahora solo falla para 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;
}

¿Alguien tiene alguna idea de dónde está el error en el código revisado? ¡Gracias a todos de nuevo!

Respuestas a la pregunta(3)

Su respuesta a la pregunta