Em bits C, multiplique por 3 e divida por 16

Um amigo meu teve esses quebra-cabeças e esse é o que está me iludindo. Aqui está o problema, você recebe um número e deseja retornar esse número vezes 3 e dividido por 16 arredondando para 0. Deve ser fácil. A pegada? Você só pode usar o! ~ & ^ | + << >> operadores e deles apenas uma combinação de 12.

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

Minha tentativa foi:

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

Mas isso não parece estar funcionando. Eu acho que tenho um problema de perder bits, mas não consigo encontrar uma maneira de salvá-los. Outra perspectiva seria legal. Apenas para adicionar, você também pode usar apenas variáveis do tipo int e sem loops, se instruções ou chamadas de função puderem ser usadas.

Agora eu tenho o número 0xfffffff. Ele deve retornar 0x2ffffff, mas está retornando 0x3000000.

questionAnswers(5)

yourAnswerToTheQuestion