【问题标题】:Efficient way to transpose the bit of an integer in python?在python中转置整数位的有效方法?
【发布时间】:2013-10-20 16:29:56
【问题描述】:

考虑一个 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 位整数时会很慢。

有没有更好的方法?
或者是什么鬼魔法<</>> 会更快?

这个问题是通过尝试对Skilling Hilbert curve algorithm进行python实现而产生的

【问题讨论】:

    标签: python bit-manipulation


    【解决方案1】:

    这应该可行:

    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,然后是cf

    print 语句中,数字是x00y000x00y000x00y(tmp &gt;&gt; 3 + i) 将这些数字转换为x,然后&lt;&lt; 1 得到x0((tmp &amp; (1 &lt;&lt; i)) &gt;&gt; i)) 首先将这些数字转换为y00/y0y,然后右移以获得简单的y。将这两部分相加,您将得到您想要的 xy 号码。

    【讨论】:

    • 很好的答案,谢谢。您能否指出如何有效地为其他分区生成掩码,例如 15 位到三个 5 位。我只能用mask=[]; mask.append ... ; int(mask,2) 做到这一点。
    • 啊,没关系,15到5,我可以:mask = 2**14 + 2**(14-5)。谢谢
    • 我忘记了一个词:mask = 2**14 + 2**(14-5) + 2**(14-2*5)
    【解决方案2】:

    如果您使用字符串 (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'
    >>>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-02
      • 2018-02-21
      • 1970-01-01
      • 2011-01-10
      • 2010-12-16
      相关资源
      最近更新 更多