извлекать каналы из побитового кодированного массива - PullRequest
0 голосов
/ 09 июля 2020

У меня есть массив с 3-мя побитовыми каналами. вот так:

1 for channel 1
2 for channel 2
3 for channel 1 and 2
4 for channel 3
5 for channel 1 and 3
6 for channel 3 and 2

Я знаю, как это сделать в Matlab bitand(digital_word, 2^1) с поразрядным и, но если я попытаюсь сделать то же самое для python, например. для канала 1 np.bitwise_and(digital_word, 2^1) я получаю gibberi sh out

Я хочу получить единицу для данного канала, если канал кодируется битом.

Некоторые примеры: ввод:

 array([0,0,1,0,1,0,3,4,5,6])

вывод:

channel 1: [0,0,1,0,1,0,1,0,1,0]
channel 2: [0,0,0,0,0,0,1,0,0,1]
channel 3: [0,0,0,0,0,0,0,1,1,1]

1 Ответ

0 голосов
/ 09 июля 2020

Я не уверен, чего вы хотели достичь, используя 2^1, но использование np.bitwise_and было правильным подходом.

Например, вы получите результат для канала 1 с помощью np.bitwise_and(digital_word, 1):

>>> digital_word = np.array([0,0,1,0,1,0,3,4,5,6])
>>> np.bitwise_and(digital_word, 1)
array([0, 0, 1, 0, 1, 0, 1, 0, 1, 0])

Для битов с более высокими значениями результат почти такой, как вы хотите, но вам нужно сдвинуть его вправо, чтобы получить 1 вместо 2 n .

>>> np.bitwise_and(digital_word, 2)
array([0, 0, 0, 0, 0, 0, 2, 0, 0, 2])
>>> np.bitwise_and(digital_word, 2) >> 1
array([0, 0, 0, 0, 0, 0, 1, 0, 0, 1])

Обратите внимание, что для получения третьего бита необходимо побитовое и с 4 (= 2 3 –1 ), а не 3:

>>> np.bitwise_and(digital_word, 4)
array([0, 0, 0, 0, 0, 0, 0, 4, 4, 4])
>>> np.bitwise_and(digital_word, 4) >> 2
array([0, 0, 0, 0, 0, 0, 0, 1, 1, 1])

В общем, чтобы получить n th бит:

np.bitwise_and(digital_word, (1 << n)) >> n

NumPy массивы также поддерживают побитовый оператор &, поэтому это эквивалентно:

(digital_word & (1 << n)) >> n
...