Oggi ho avuto un'intervista in cui mi hanno chiesto di scrivere due funzioni "C", una per estrarre un singolo bit e l'altra per estrarre un intervallo di bit da un carattere. Ho impiegato un po 'di tempo e ho trovato questi metodi.Come estrarre un po 'in modo ottimale?
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));
}
Ma l'intervistatore continuava a chiedermi se potevo accelerare il codice ulteriormente (in termini di cicli di CPU), e se non v'è alcuna possibilità di ottimizzazione che ho potuto fare per realizzarlo. Ero chiaramente fuori di sé e sono curioso di sapere come lo faresti?
L'utilizzo di C++ TMP offre un'incredibile velocità di runtime. ':' – sbi
Non penso che i template aggiungano nulla. Un compilatore dovrebbe essere in grado di ottimizzare l'inferno di queste funzioni se sono chiamate con costanti ... – sth
Per evitare problemi con lo spostamento e le operazioni logiche sui valori firmati, renderei tutti i parametri 'senza segno'. Come plus, se non sono firmati non è necessario controllare '> = 0'. – pmg