2016-02-08 2 views
0

Я пытаюсь получить несколько бит из байта в C. В настоящее время я делаю это путем сдвига, а затем маскирования бит (0xFF), однако оператор сдвига занимает много времени. Есть ли другой способ использования только побитовых операций? И если да, то как?Получение битов из байта без сдвигов

Спасибо!

+1

Как вы определили, что оператор сдвига занимает много времени? Сколько? Возможно, вам следует показать небольшой пример кода того, что вы делаете. –

ответ

2

Если вы хотите переместить конкретный (один) бит к наименее значимое место, вы можете использовать хак, как это:

(x & mask) != 0 

где mask выбирает один бит.

1

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

Даже если вы разрешаете базовую арифметику, соответствующие операции умножаются и делятся по степеням 2 - медленнее и менее очевидны, чем операции сдвига.


Чтобы сдвинуть правые N бит, разделите их на 2^N. Чтобы сдвинуть левые N бит, умножьте на 2^N.

Если биты находятся в одном и том же месте каждый раз, и вы можете использовать их там, где они есть, а затем переместите маску. Например,

word & 0x3FC0 

получит биты 2-9 (или 13-6, в зависимости от вашей индексации) слова.

Как и прежде, я был бы удивлен, обнаружив, что арифметика быстрее, чем смещение. Какую платформу вы используете, где Смещение медленное? Большинство процессоров имеют это в качестве машинной инструкции.


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

+0

, так что если im использует переключение для получения последовательного набора бит в байте, но операция переключения очень дорогая на использовании микроконтроллера im, нет другого способа сделать это? – beginnerHacker

+0

Это другой вопрос. Что * точно * это «это», которое вы хотите сделать? Просто * получение * последовательный набор бит просто ** и ** против соответствующей маски. Измените свой вопрос, чтобы описать реальную проблему. – Prune

+0

Извините, что так поздно заметили этот комментарий! Я редактировал свой вопрос. Благодаря! – beginnerHacker

 Смежные вопросы

  • Нет связанных вопросов^_^