在python中转置整数位的有效方法?

时间:2013-10-20 16:29:56

标签: python bit-manipulation

考虑一个6位整数

x = a b c d e f

应该转换为2位的三个整数,如下所示

x1 = a d  
x2 = b e
x3 = c f

在python中执行此操作的有效方法是什么?

我目前如下

bit_list = list( bin(x)[2:] ) # to chop of '0b'

# pad beginning if necessary, to make sure bit_list contains 6 bits
nb_of_bit_to_pad_on_the_left = 6 - len(bit_list)

for i in xrange(nb_of_bit_to_pad_on_the_left):
    bit_list.insert(0,'0')

# transposition
transpose = [ [], [], [] ]
for bit in xrange(0,  6, 2):
    for dimension in xrange(3):
        x = bit_list[bit + dimension]
        transpose[dimension].append(x)

for i in xrange(n):
    bit_in_string = ''.join(transpose[i])
    transpose[i] = int(bit_in_string, 2)

但是当将5 * 1e6位整数转换为1位5位整数时,这很慢。

有更好的方法吗?
或者某些神奇的魔法<</>>会更快?

尝试创建Skilling Hilbert curve algorithm

的python实现时出现了这个问题

2 个答案:

答案 0 :(得分:2)

这应该有效:

mask = 0b100100

for i in range(2, -1, -1):
    tmp = x & mask
    print(((tmp >> 3 + i) << 1) + ((tmp & (1 << i)) >> i))
    mask >>= 1

第一个掩码仅提取ad,然后将其移至仅提取be,然后提取c和{{1} }。

f声明中,数字为printx00y000x00y000x00y将这些数字转换为(tmp >> 3 + i),然后x获得<< 1x0首先将这些数字转换为((tmp & (1 << i)) >> i)) / y00y0,然后右移以简单地获取y。将这两部分相加,即可获得所需的y数字。

答案 1 :(得分:1)

如果您使用字符串(bin(x))。

,切片将起作用
>>> 
>>> HInt = 'ABCDEFGHIJKLMNO'
>>> x = []
>>> for i in [0, 1, 2]:
    x.append(HInt[i::3])


>>> x[0]
'ADGJM'
>>> x[1]
'BEHKN'
>>> x[2]
'CFILO'
>>>