Miałem dzisiaj wywiad, w którym poprosili mnie o napisanie dwóch funkcji "C", jednego, by wyodrębnić jeden i drugi, by wyodrębnić zakres bitów od postaci. Wziąłem chwilę i wymyśliłem te metody.Jak wyodrębnić nieco w bardziej optymalny sposób?
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));
}
Ale wywiad pytali mnie, czy mogę przyspieszyć kod dalej (pod względem cykli CPU) i czy jest jakiś zakres optymalizacji, które można zrobić, aby go osiągnąć. Byłem zupełnie nieswojo i jestem ciekawa, jak byś to zrobił?
Korzystanie z C++ TMP dałoby niesamowite przyspieszenie czasu pracy. ':)' – sbi
Nie sądzę, by szablony dodawały coś. Kompilator powinien być w stanie zoptymalizować te funkcje, jeśli są wywoływane ze stałymi ... – sth
Aby uniknąć problemów z operacjami przesuwania i operacji logicznych na wartościach podpisanych, wszystkie parametry zostałyby ustawione na "unsigned". Jako plus, jeśli są niepodpisane, nie musisz sprawdzać, czy '> = 0'. – pmg