Поворот массива с использованием Python как одного двоичного блока - PullRequest
3 голосов
/ 25 марта 2019

У меня есть один массив, как [4, 255, 16], с dtype = int8. Я хочу повернуть его влево, но как двоичный поворот.

Я хочу, чтобы мой массив был таким, как описано ниже:

000001001111111100010000

После поворота влево на 2 бита это будет:

000100111111110001000000

В десятичном виде, как [17, 252, 64]

Ответы [ 2 ]

3 голосов
/ 25 марта 2019

Вы можете использовать deque из collections, если хотите красиво повернуть,

>>> from array import array
>>> from collections import deque
>>> x = array('l', [4, 255, 16])
>>> x
array('l', [4, 255, 16])
>>> z = ''.join([format(y, 'b').zfill(8) for y in x.tolist()])
>>> z
'000001001111111100010000'
>>> d = deque(z)
>>> d.rotate(-2)
>>> ''.join(d)
'000100111111110001000000'
>>> k = ''.join(d)
>>> [int(k[i:i+8],2) for i in range(0, len(k), 8)]
[19, 252, 64]
1 голос
/ 25 марта 2019

Вы хотите повернуть массив, как если бы он был одним длинным целым числом.

Приведенное ниже решение преобразует массив в одно длинное целое число, то есть просто Python int, вращает его с помощью побитовой арифметики и записывает обратно в массив.

код

from array import array

def shift_left(arr, shift=1):
    if not arr:
        return

    long = 0
    itemsize = arr.itemsize * 8
    bit_length = len(arr) * itemsize
    item_bits = (1 << itemsize) - 1
    bits = (1 << bit_length) - 1

    # Convert the array to a long integer
    for i, x in enumerate(reversed(arr)):
        long |= x << (i * itemsize)

    # Left part of the | shifts the long left and drops the overflow
    # Right part of the | adds the last bits at the start of the long
    long = (long << shift & bits) | long >> (bit_length - shift)

    # Write back the long integer in the array
    for i in range(1, len(arr) + 1):
        arr[-i] = long & item_bits
        long >>= itemsize

Пример

arr = array('B', [4, 255, 16])
shift_left(arr, shift=2)
print(arr)

Выход

array('B', [19, 252, 64])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...