使用python作为一个块二进制文件旋转数组

使用python作为一个块二进制文件旋转数组,python,python-3.x,pandas,numpy,Python,Python 3.x,Pandas,Numpy,我有一个类似于[4,255,16]的数组,带有dtype=int8。我想向左旋转它,但像一个二进制旋转 我希望我的数组如下所述: 000001001111111100010000 向左旋转2位后,将为: 000100111111110001000000 在类似于十进制的[1725264]中,如果您想很好地旋转它,可以使用集合中的deque >>> from array import array >>> from collections import deq

我有一个类似于
[4,255,16]
的数组,带有
dtype=int8
。我想向左旋转它,但像一个二进制旋转

我希望我的数组如下所述:

000001001111111100010000
向左旋转2位后,将为:

000100111111110001000000

在类似于十进制的
[1725264]

中,如果您想很好地旋转它,可以使用
集合中的
deque

>>> 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]

您希望将数组旋转为一个长整数

下面的解决方案将数组转换为一个长整数,即一个Python
int
,使用位运算对其进行旋转,然后将其写回到数组中

代码 输出
你已经试过什么了吗?当我们有一些代码作为起点时总是更好。难道
00010011111110001000000
不应该是
[19252,64]
?为什么要使用
数组
z=''.join([format(y,'b').zfill(8)for y in x])
if
x=[425516]
工作得很好。@DavidBuck我只是想向用户展示一下,如果他已经有了
数组的话。问题从,
开始,我有一个类似[425516]的数组,dtype=int8
。这是
array.array('l',[425516])
:)谢谢你有趣的回答。虽然可以删除
.tolist()
?@GrijeshChauhan当然,他可以从一个简单的
列表开始
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])