En bits C, multiplique por 3 y divida por 16

Un amigo mío tenía estos rompecabezas y este es uno que me está eludiendo. Aquí está el problema, se le da un número y desea devolver ese número por 3 y dividido por 16 redondeando hacia 0. Debería ser fácil. ¿La captura? ¡Solo puedes usar el! ~ & ^ | + << >> operadores y de ellos solo una combinación de 12.

int mult(int x){
    //some code here...
return y;
}

Mi intento ha sido:

    int hold = x + x + x;
    int hold1 = 8;
    hold1 = hold1 & hold;
    hold1 = hold1 >> 3;
    hold = hold >> 4;
    hold = hold + hold1;
    return hold;

Pero eso no parece estar funcionando. Creo que tengo un problema de perder bits, pero parece que no puedo encontrar una manera de guardarlos. Otra perspectiva sería buena. Solo para agregar, también puede usar variables de tipo int y sin bucles, si se pueden usar declaraciones o llamadas a funciones.

En este momento tengo el número 0xfffffff. Se supone que devuelve 0x2ffffff pero devuelve 0x3000000.