Hoy tuve una entrevista donde me pidieron que escribiera dos funciones "C", una para extraer un bit y otra para extraer un rango de bits de un personaje. Me tomó un tiempo y se me ocurrieron estos métodos.¿Cómo extraigo un bit de forma más óptima?
int extractBit(char byte, int pos) {
assert((pos >= 0) && (pos < 8));
return ((byte & (1<<pos)) >> pos);
}
char extractBitRange(char byte, int startingPos, int offset) {
assert(((startingPos + offset) >= 0) && ((startingPos + offset) < 8));
return (byte >> startingPos) & ~(0xff << (offset + 1));
}
Pero el entrevistador me preguntaba si podía acelerar el código adicional (en términos de ciclos de CPU) y si hay algún alcance de la optimización que podía hacer para lograrlo. Estaba claramente mal y tengo curiosidad por saber cómo harías esto?
El uso de C++ TMP daría una increíble aceleración en el tiempo de ejecución. ':)' – sbi
No creo que las plantillas agreguen nada. Un compilador debería ser capaz de optimizar al máximo estas funciones si son llamadas con constantes ... – sth
Para evitar problemas con el cambio y las operaciones lógicas en los valores firmados, haría todos los parámetros a las funciones 'unsigned'. Como una ventaja, si no están firmados, no es necesario que compruebe '> = 0'. – pmg