Битовая операция и использование - PullRequest
90 голосов
/ 17 ноября 2009

Рассмотрим этот код:

x = 1        # 0001
x << 2       # Shift left 2 bits: 0100
# Result: 4

x | 2        # Bitwise OR: 0011
# Result: 3

x & 1        # Bitwise AND: 0001
# Result: 1

Я могу понять арифметические операторы в Python (и других языках), но я никогда не понимал «побитовые» операторы достаточно хорошо. В приведенном выше примере (из книги по Python) я понимаю сдвиг влево, но не два других.

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

Ответы [ 16 ]

2 голосов
/ 09 августа 2012

Другим распространенным вариантом использования является манипулирование / тестирование прав доступа к файлам. Смотрите модуль статистики Python: http://docs.python.org/library/stat.html.

Например, чтобы сравнить разрешения файла с желаемым набором разрешений, вы можете сделать что-то вроде:

import os
import stat

#Get the actual mode of a file
mode = os.stat('file.txt').st_mode

#File should be a regular file, readable and writable by its owner
#Each permission value has a single 'on' bit.  Use bitwise or to combine 
#them.
desired_mode = stat.S_IFREG|stat.S_IRUSR|stat.S_IWUSR

#check for exact match:
mode == desired_mode
#check for at least one bit matching:
bool(mode & desired_mode)
#check for at least one bit 'on' in one, and not in the other:
bool(mode ^ desired_mode)
#check that all bits from desired_mode are set in mode, but I don't care about 
# other bits.
not bool((mode^desired_mode)&desired_mode)

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

1 голос
/ 21 января 2016

я не видел упомянутого, этот пример покажет вам десятичную операцию (-) для 2-битных значений: A-B (только если A содержит B)

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

111 #decimal 7
-
100 #decimal 4
--------------
011 #decimal 3

с питоном: 7 & ~ 4 = 3 (убрать из 7 битов, которые представляют 4)

001 #decimal 1
-
100 #decimal 4
--------------
001 #decimal 1

с питоном: 1 & ~ 4 = 1 (убрать из 1 биты, которые представляют 4 - в этом случае 1 не «содержит» 4) ..

1 голос
/ 22 марта 2014

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

import numpy as np
a=np.array([1.2, 2.3, 3.4])
np.where((a>2) and (a<3))      
#Result: Value Error
np.where((a>2) & (a<3))
#Result: (array([1]),)
0 голосов
/ 19 февраля 2019

Чтобы перевернуть биты (т.е. дополнение / инвертирование 1), вы можете сделать следующее:

Поскольку значение ExORed со всеми 1 приводит к инверсии, для заданной ширины в битах вы можете использовать ExOR для их инвертирования.

In Binary
a=1010 --> this is 0xA or decimal 10
then 
c = 1111 ^ a = 0101 --> this is 0xF or decimal 15
-----------------
In Python
a=10
b=15
c = a ^ b --> 0101
print(bin(c)) # gives '0b101'
0 голосов
/ 22 декабря 2017

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

0 голосов
/ 12 мая 2016

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

>>> import bitstring
>>> bitstring.BitArray(bytes='ABCDEFGHIJKLMNOPQ') << 4
BitArray('0x142434445464748494a4b4c4d4e4f50510')
>>> bitstring.BitArray(hex='0x4142434445464748494a4b4c4d4e4f5051') << 4
BitArray('0x142434445464748494a4b4c4d4e4f50510')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...