在Python中128位输入的32位之后拆分每个

在Python中128位输入的32位之后拆分每个,python,bit-manipulation,Python,Bit Manipulation,我试图在Python中执行128位操作,在32位之后拆分128位 var = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF # var may take any value from 0x0 to 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 我已经试过了 n = 8 # for 32 bit splitting [var[i:i+n] for i in range(0, len(var), n)] 但是没有内置的长度运算符来查找long变量

我试图在Python中执行128位操作,在32位之后拆分128位

var = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF # var may take any value from 0x0 to  0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
我已经试过了

n = 8 # for 32 bit splitting
[var[i:i+n] for i in range(0, len(var), n)]
但是没有内置的长度运算符来查找
long
变量的长度。我研究了bitarray模块,我不想在我的代码中使用bitarray,有任何python方式的东西吗


预期输出为
[0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF]

您可以使用位移位(
)和按位and(
&
):

其中,
i
是整数。结果列表将有4个元素(因为128/32是4)

在您的例子中,结果是4个相等的数字(4294967295,因为4294967295是十六进制的0xFFFFFF)

这在已知位数(32)的情况下效果很好,但我更愿意使用helper函数(遵循与上面相同的逻辑):


最好用数字而不是stirng

var = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
[(var & (0xFFFFFFFF << 32*i)) >> (32*i) for i in range(4)]

你的意思是
[0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF]
?你是否用引号声明了
var
?不,我刚刚编辑了我的问题,请仔细研究一下,你能用python3代替python2吗?谢谢!!很高兴知道,我会经常切换到python 3Thanks。有可能找到长整数的长度吗?我以后可能需要它,有没有可能的方法?@Jonny是的,你看。我已经试过了,但我对它抛出这个错误感到困惑TypeError:描述符“bit_length”需要一个“int”对象,但收到了一个“long”。@Jonny嗯,你的Python解释器的版本是什么?只是抛出这个,但以这种方式拆分负值会产生一个无止境的循环<代码>拆分位(-1)由于Python表示数字的方式。非常感谢farincz。我已经编辑了我的问题陈述,请查看
def split_bits(value, n):
    ''' Split `value` into a list of `n`-bit integers '''
    mask, parts = (1 << n) - 1, []
    parts = []
    while value:
        parts.append(value & mask)
        value >>= n
    parts.reverse()
    return parts
In [14]: split_bits(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 32)
Out[14]: [4294967295, 4294967295, 4294967295, 4294967295]

In [15]: [format(i, 'X') for i in _] # show corresponding hex representations
Out[15]: ['FFFFFFFF', 'FFFFFFFF', 'FFFFFFFF', 'FFFFFFFF']

In [16]: split_bits(0b1000100110101011, 4)
Out[16]: [8, 9, 10, 11]

In [17]: [format(i, 'b') for i in _] # show corresponding binary representations
Out[17]: ['1000', '1001', '1010', '1011']
var = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
[(var & (0xFFFFFFFF << 32*i)) >> (32*i) for i in range(4)]
format(n, 'x')