2013-03-20 2 views
2

Я извлекаю 8-й бит из байта в C. Вот мой пример. Эффективность извлечения бит из байта

register unsigned char byte; 

int pos = 7; 

int x =(byte >> pos) & 1; //Method I 

int y =(byte & 0x80) >> pos; //Method II 

Оба метода приведет к тому же выходу, но и является одним из способов более эффективных, чем другие?

+1

метод 2 не будет работать, если позиция имеет другое значение –

+0

Если выполнение операции имеет решающее значение для вас, то вам необходимо проверить сборку, что компилятор генерирует а также сравнить его. – joshuanapoli

+0

Они такие же, но вы можете оптимизировать его для определенных наборов инструкций, спустившись к сборке и используя прыжок, если нуль/прыжок, если нести инструкции ... – nonsensickle

ответ

4

Оба будут такими же. И инструкции AND и SHR - это 1-часовые инструкции для процессоров Intel.

+0

Хорошая точка. Я думаю, что независимо от значения бита (одного или нуля) в байте процессор будет выполнять AND-IN всех битов. – katta

1

Побитовые операции в основном одной из самых быстрых вещей, которые вы найдете на компьютере. Я бы предположил, что любая разница будет невероятно минор, так что это не имеет большого значения.

1

Если вы знаете немного вы извлекаете во время компиляции, то любой метод должен иметь примерно такую ​​же скорость:

unsigned char val; 
const int pos = 4; 
... 
int x = (val >> pos) & 1; 
int y = (val & 0x10) >> pos; 

Однако, если вы расчет положения во время выполнения, а не как константы, делая И-последний должен быть быстрее:

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; 
Смежные вопросы