Побитовые операции все еще практичны? - PullRequest
6 голосов
/ 03 июля 2011

Википедия, единственный настоящий источник знаний, утверждает:

В большинстве старых микропроцессоров побитовые операции немного быстрее, чем операции сложения и вычитания, и обычно значительно быстрее, чем операции умножения и деления.На современных архитектурах это не так: побитовые операции, как правило, имеют ту же скорость, что и сложение (хотя все еще быстрее, чем умножение).

Есть ли практическая причина для изучения побитовых операций или сейчаспросто что-то вы изучаете для теории и любопытства?

Ответы [ 9 ]

13 голосов
/ 03 июля 2011

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

Строки, которые вы процитировали из статьи Википедии, просто пытались дать некоторые подсказки о скорость побитовых операций.К сожалению, в статье не приводится несколько хороших примеров приложений.

11 голосов
/ 03 июля 2011

Побитовые операции все еще полезны. Например, они могут быть использованы для создания «флагов» с использованием одной переменной и экономии на количестве переменных, которые вы использовали бы для обозначения различных условий. Что касается производительности арифметических операций, лучше оставить компилятору оптимизацию (если вы не какой-то гуру).

4 голосов
/ 03 июля 2011

Они полезны для понимания того, как «работает» двоичный файл; в противном случае нет. На самом деле, я бы сказал, что даже если побитовые хаки быстрее в данной архитектуре, компилятор должен использовать этот факт, а не ваш. Напишите, что вы имеете в виду.

1 голос
/ 07 апреля 2012

Забавно, что никто не счел нужным упомянуть массив ctype [] в C / C ++ - также реализованный в Java.Эта концепция чрезвычайно полезна при обработке языка, особенно при использовании разных алфавитов или при разборе предложения.

ctype [] - это массив из 256 коротких целых чисел, и в каждом целом числе есть биты, представляющие разные типы символов,Например, ctype [; A '] - ctype [' Z '] имеют биты, установленные, чтобы показать, что они являются заглавными буквами алфавита;ctype ['0'] - ctype ['9'] имеют биты, установленные, чтобы показать, что они числовые.Чтобы увидеть, является ли символ x буквенно-цифровым, вы можете написать что-то вроде «if (ctype [x] & (UC | LC | NUM))», что несколько быстрее и намного более элегантно, чем запись «if ('A' = x <= 'Z' || .... '. </p>

Как только вы начинаете мыслить побитно, вы находите много мест для его использования. Например, у меня было два текстовых буфера. Я записал один в другой, заменив еговсе вхождения FINDstring с REPLACEstring по мере того как я пошел. Затем для следующей пары находить-заменить я просто переключал индексы буфера, поэтому я всегда записывал из буфера [in] в buffer [out]. 'in' начинался как 0, 'out 'как 1. После завершения копирования я просто написал' in ^ = 1; out ^ = 1; '. И после обработки всех замен я просто записал буфер [out] на диск, не нужно знать, что было "out"в то время.

Если вы думаете, что это низкий уровень, учтите, что определенные умственные ошибки, такие как дежа-вю и его близнецовый джамаис-ву, вызваны ошибками в мозговых битах!

1 голос
/ 03 июля 2011

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

1 голос
/ 03 июля 2011

Зависит от вашей проблемы.Если вы управляете аппаратным обеспечением, вам нужны способы установить отдельные биты в целом числе.

Купите плату PCI OGD1 (открытая видеокарта) и поговорите с ней, используя libpci.http://en.wikipedia.org/wiki/Open_Graphics_Project

1 голос
/ 03 июля 2011

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

Если вы хотите выполнять арифметику, используйте арифметические операторы.

1 голос
/ 03 июля 2011

Конечно (для меня) ответ - да.Тот факт, что в настоящее время инструкция add выполняется так же быстро, как и or или and, просто означает, что ... но or не является add, и вы будете использовать его, когда вам все равно нужно (несуммировать конечно, но просто выполнить or, ...).Улучшения в скорости выполнения инструкций, таких как сложение, деление и т. Д., Просто означают, что теперь вы можете их использовать и меньше беспокоиться о влиянии на производительность, но теперь это верно, как и в прошлом, вы не измените ни одного add нанесколько побитовых операций!

0 голосов
/ 03 июля 2011

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

Работа с адресами IPv6 требует тех же фундаментальных операций на уровне битов, но поскольку они очень длинные, я не уверен, как они реализованы. Я бы поспорил, что они по-прежнему реализуются с использованием битовых операторов для частей данных, которые имеют соответствующий размер для архитектуры.

...