Conozco dos formas de lograr lo que te propones, la primera es como vos lo hiciste. Y no veo que sea lenta.
La primera... es esta, Para que hacerlo completo (Hasta al A7), si luego lo haces 0, entonces podemos hacerlo hasta el A3 nomas?
temp = input_a();
var = 0;
if (bit_test(temp,0)) bit_set(var,3);
if (bit_test(temp,1)) bit_set(var,2);
if (bit_test(temp,2)) bit_set(var,1);
if (bit_test(temp,3)) bit_set(var,0);
La otra forma que conozco es aprovechar el bit Carry del micro, pero que en C esto no se puede aprovechar. Asi que de hacerlo tiene que ser en ASM, el "costo" computacional es el mismo que el caso anterior. El costo computacional de lo anterior si el compilador optimiza correctamente deberia ser de 10 ciclos de reloj ( constantes ).