Я извлекаю 8-й бит из байта в C. Вот мой пример.
register unsigned char byte;
int pos = 7;
int x =(byte >> pos) & 1; //Method I
int y =(byte & 0x80) >> pos; //Method II
Оба метода приведут к одинаковому результату, но является ли один из методов более эффективным, чем другой?
Оба будут одинаковыми. Инструкции AND и SHR являются одночасовыми на процессорах Intel.
Побитовые операции — одна из самых быстрых вещей, которые вы можете найти на компьютере. Я полагаю, что любая разница будет невероятно незначительный, такой, что это действительно не имеет значения.
Если вы знаете бит, который вы извлекаете во время компиляции, тогда любой метод должен иметь примерно одинаковую скорость:
unsigned char val;
const int pos = 4;
...
int x = (val >> pos) & 1;
int y = (val & 0x10) >> pos;
Однако, если вы вычисляете позицию во время выполнения, а не как константу, выполнение последнего оператора AND должно быть быстрее:
unsigned char val;
int pos;
...
/* requires only a shift and AND */
int x = (val >> pos) & 1;
/* requires two shifts and AND */
int y = (val & (1 << pos)) >> pos;