Каковы преимущества использования побитовых операций над логическими операциями в Python?
У меня возникают проблемы с пониманием того, почему я хотел бы использовать побитовые операторы в языке высокого уровня, таком как Python. Из того, что я узнал о высокоуровневых и низкоуровневых языках, является то, что высокоуровневые языки обычно предназначены для того, чтобы вам не приходилось слишком сильно беспокоиться о том, что машинный код входит в компьютер. Хотя я определенно не являюсь опытным программистом, я не вижу смысла в постепенном манипулировании программой на языке, который, насколько мне известно, был разработан, чтобы этого избежать.
Конечно, это предполагает, что я правильно понимаю различие языков высокого и низкого уровня.
Прежде чем опубликовать, я хочу уточнить, что я понимаю, что такое побитовые операции. Здесь я нашел много вопросов, которые просто объясняли, что такое побитовые операции, и / или указывали на вопрос, который объяснял операции. Мне просто трудно понять, почему кто-то когда-либо использовал бы его в Python по сравнению с другими, более легкими (по моему мнению новичка) решениями с исправленными ошибками.
tl; dr В качестве альтернативы, каковы некоторые примеры кода, который использует побитовые операции, когда более простая логическая логика не может быть использована?
3 ответа
Если вы хотите конкретный пример использования побитовых операторов в стандартной библиотеке, просто посмотрите на re
библиотека. Согласно API, флаги должны быть побитовыми OR
Вместе
Это позволяет передавать большое количество параметров в одном аргументе. Рассмотрим следующие варианты:
re.compile(expression,re.I | re.M | re.X)
против
re.compile(expression,ignorecase=True,multiline=True,verbose=True)
Я думаю, что мы можем согласиться, что первая версия, по крайней мере, намного более компактна.
Вы можете подумать: "Ну, мне нравится второе лучше - в конце концов, оно более явное!" ... И у тебя может быть на это повод. Но что, если у вас есть коллега, который сгенерировал двоичный файл в C, и он сказал вам, что заголовок файла содержит 32-битное целочисленное поле, а в этом целочисленном поле хранятся флаги, необходимые для декодирования остальной части файла? Вы, будучи разумным человеком, хотите работать с файлом на языке высокого уровня, где вы можете легко и эффективно манипулировать данными, чтобы выбрать Python. Готов поспорить, что вы рады, что можете выполнять побитовые операции, чтобы избежать необходимости использовать C для декодирования / анализа вашего файла.
Определенно есть применение для побитовых операций в Python. Помимо or
-ing флаги, как упоминает mgilson, я сам использовал их для составления заголовков пакетов для сообщений CAN. Очень часто заголовки для протокола сообщений более низкого уровня состоят из полей, длина которых не кратна 8 битам, поэтому вам понадобятся побитовые операторы, если вы хотите изменить только одно поле.
Python как язык более высокого уровня не означает, что вы не можете делать низкоуровневые вещи с ним!
Практически все, что использует протоколы передачи, в какой-то момент будет заканчиваться использованием побитовой операции - набор флагов, которые являются истинными или ложными, обычно объединяются в один байт для до 8 флагов, чтобы сэкономить на пропускной способности и не иметь словаря из 255 значения для его декодирования - не смейтесь, я видел, что это было сделано более чем на одном языке в одном случае с очень большим количеством операторов if if else - когда нужно было всего лишь несколько побитовых операций.