Convertir Número a Hexadecimal

Este problema consiste en, dado un entero de 32 bits num, regresar su representación en hexadecimal como cadena. Para los números negativos se usa su representación en complemento a dos. La cadena no debe tener ceros a la izquierda y usa letras minúsculas; el cero se representa como "0".

Solución

class Solution {
public:
    string toHex(int num) {
        string s;
        if (num == 0) {
            return "0";
        }
        unsigned int n = num;
        char hex[] = "0123456789abcdef";
        while (n > 0) {
            int val = n & 0b1111;
            char sele = hex[val];
            s += sele;
            n = n >> 4;
        }
        reverse(s.begin(), s.end());
        return s;
    }
};

El caso 0 se maneja aparte porque el ciclo no se ejecutaría. Al convertir num a unsigned int se obtiene automáticamente su representación en complemento a dos si era negativo, lo que permite procesarlo igual que un positivo. Después se toman los 4 bits menos significativos (n & 0b1111), se usa ese valor como índice en la cadena de dígitos hexadecimales y se desplaza n 4 bits a la derecha. Como los dígitos se generan de menor a mayor peso, al final se invierte la cadena.