0

考虑一个 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 位整数转置为一百万个 5 位整数时会很慢。

有没有更好的方法?或者一些会更快的
bitshit魔法?<</>>

这个问题是通过尝试对Skilling Hilbert 曲线算法进行 python 实现而出现的

4

2 回答 2

2

这应该有效:

mask = 0b100100

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

第一个掩码仅提取aand d,然后转移到仅提取bande然后cand f

print语句中,数字是x00y00or0x00y000x00y。将(tmp >> 3 + i)这些数字转换成x,然后<< 1得到x0。第((tmp & (1 << i)) >> i))一个将这些数字转换为y00/y0y然后右移以获得简单的y. 将这两个部分相加,您将得到所需的xy数字。

于 2013-10-20T16:50:43.427 回答
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'
>>>
于 2013-10-20T17:13:30.157 回答