在Python中使用32位128位输入后拆分每个

时间:2015-08-17 14:35:50

标签: 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变量的长度。我研究了bitarray模块,我不想在我的代码中使用位数组,有什么东西用pythonic方式吗?

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

2 个答案:

答案 0 :(得分:4)

您可以使用位移(Call)和按位AND(>>):

&

其中In [10]: [(i >> x) & 0xFFFFFFFF for x in reversed(range(0, 128, 32))] Out[10]: [4294967295, 4294967295, 4294967295, 4294967295] 是你的整数。结果列表将包含4个元素(因为 128/32 4 )。

在你的情况下,结果是4个相等的数字( 4294967295 ,因为 4294967295 0xFFFFFFFF 的十六进制)。

这适用于已知的位数(32),但我更倾向于使用辅助函数(遵循与上面相同的逻辑):

i

行动中:

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

答案 1 :(得分:0)

使用数字而不是搅拌更好

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

最终你可以将数字转换为字符串十六进制表示

format(n, 'x')