2013-07-10 4 views
3

У меня возникли проблемы с пониманием того, почему я хотел бы использовать побитовые операторы на высокоуровневом языке, таком как Python. Из того, что я узнал о высокоуровневых языках, это то, что высокоуровневые, как правило, предназначены для того, чтобы вам не приходилось слишком беспокоиться о том, что машинный код входит в компьютер. Хотя я определенно не эксперт-программист, я не вижу смысла манипулировать программой по-бит на языке, который, насколько мне известно, был разработан, чтобы избежать его.В чем преимущества использования побитовых операций над булевыми операциями в Python?

Конечно, это предполагает, что я правильно понимаю различие языков высокого и низкого уровня.

Я хочу уточнить, прежде чем опубликовать, что я понимаю, какие побитовые операции. Здесь я нашел много вопросов, которые просто объясняли, какие побитовые операции были и/или указывали на вопрос, который объяснял операции. Мне просто сложно понять, почему кто-либо когда-либо использовал его в Python по сравнению с другими, более легко (по моему мнению, новичкам) исправлениями с исправлением ошибок.

tl; dr В качестве альтернативы, какие примеры кода используют побитовые операции, когда более простая логическая логика не может быть использована?

ответ

3

Если вы хотите, чтобы конкретный пример побитовых операторов использовался в стандартной библиотеке, просто просмотрите библиотеку re. According to the API, флаги должны быть побитовыми OR ed вместе.

Это позволяет передавать большое количество параметров в одном аргументе. Рассмотрим следующие варианты:

re.compile(expression,re.I | re.M | re.X) 

против

re.compile(expression,ignorecase=True,multiline=True,verbose=True) 

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


Возможно, вы думаете: «Ну, мне нравится второе лучше - ведь яснее!» ... И у вас может быть случай для этого. Но что, если бы у вас был коллега, который сгенерировал двоичный файл на C, и он сказал вам, что заголовок файла содержит 32-битное целочисленное поле, и это целочисленное поле хранит флаги, необходимые для декодирования остальной части файла? Вы, будучи разумным человеком, хотите работать с файлом на высокоуровневом языке, где вы можете легко и эффективно манипулировать данными, чтобы выбрать python. Теперь я уверен, вы рады, что можете выполнять побитовые операции, чтобы не позволить себе использовать C для декодирования/анализа вашего файла.

+0

Я никогда не думал об использовании их для работы с другими языками. Это имеет большой смысл. Большое спасибо. Думаю, я обращу больше внимания на классы по побитовым операциям, которые появятся на следующей неделе. – b4ux1t3

+0

@ b4ux1t3 - Кроме того, FWIW, в python, операторы отображают вызовы функций для объектов, на которых они работают. Таким образом, побитовые операторы ('| & ^') могут быть перегружены, чтобы делать классные вещи и на других типах. Например, встроенные объекты set используют '|' для обозначения union и '&' для обозначения пересечения. – mgilson

3

Существует определенно использование для побитовых операций в Python. Помимо or -подобных флагов, как упоминает милльсон, я сам использовал их для составления заголовков пакетов для сообщений CAN. Очень часто заголовки для протокола сообщений нижнего уровня состоят из полей, длина которых не кратна 8 битам, поэтому вам понадобятся побитовые операторы, если вы хотите изменить только одно поле.

Python, являющийся языком более высокого уровня, не означает, что вы не можете делать низкоуровневые вещи с ним!

0

Почти все, что использует протоколы передачи, в какой-то момент закончит использование побитовой операции - набор флагов, которые являются истинными или ложными, обычно объединяются в один байт для 8 флагов, чтобы сэкономить на пропускной способности и не иметь словарь из 255 значений для его декодирования - не смейтесь, я видел, как это делалось на более чем одном языке в одном случае с очень большим количеством статусов if else, когда было всего несколько поразрядных операций, которые были необходимы.

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

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