在python中转换整数位的有效方法?
考虑一个6位整数在python中转换整数位的有效方法?,python,bit-manipulation,Python,Bit Manipulation,考虑一个6位整数 x = a b c d e f 应将其转置为三个2位整数,如下所示 x1 = a d x2 = b e x3 = c f 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
x = a b c d e f
应将其转置为三个2位整数,如下所示
x1 = a d
x2 = b e
x3 = c f
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)
在python中实现这一点的有效方法是什么
我目前的做法如下
x1 = a d
x2 = b e
x3 = c f
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位整数转换为100万个5位整数时,速度会很慢
有更好的方法吗?或者一些更快速的狗屎魔术 这个问题是在尝试用python实现时产生的,它应该可以工作:
mask = 0b100100
for i in range(2, -1, -1):
tmp = x & mask
print(((tmp >> 3 + i) << 1) + ((tmp & (1 << i)) >> i))
mask >>= 1
mask=0b100100
对于范围(2,-1,-1)内的i:
tmp=x&mask
打印(((tmp>>3+i)i))
掩码>>=1
第一个掩码仅提取a
和d
,然后将其移动到仅提取b
和e
,然后是c
和f
在print
语句中,数字为x00y00
或0x00y0
或00x00y
。(tmp>>3+i)
将这些数字转换为x
,然后i)
首先将这些数字转换为y00
/y0
或y
,然后右移以获得y
。将两部分相加,得到所需的数值。这应该可以:
mask = 0b100100
for i in range(2, -1, -1):
tmp = x & mask
print(((tmp >> 3 + i) << 1) + ((tmp & (1 << i)) >> i))
mask >>= 1
mask=0b100100
对于范围(2,-1,-1)内的i:
tmp=x&mask
打印(((tmp>>3+i)i))
掩码>>=1
第一个掩码仅提取a
和d
,然后将其移动到仅提取b
和e
,然后是c
和f
在print
语句中,数字为x00y00
或0x00y0
或00x00y
。(tmp>>3+i)
将这些数字转换为x
,然后i)
首先将这些数字转换为y00
/y0
或y
,然后右移以获得y
。将两部分相加,得到所需的数值。这应该可以:
mask = 0b100100
for i in range(2, -1, -1):
tmp = x & mask
print(((tmp >> 3 + i) << 1) + ((tmp & (1 << i)) >> i))
mask >>= 1
mask=0b100100
对于范围(2,-1,-1)内的i:
tmp=x&mask
打印(((tmp>>3+i)i))
掩码>>=1
第一个掩码仅提取a
和d
,然后将其移动到仅提取b
和e
,然后是c
和f
在print
语句中,数字为x00y00
或0x00y0
或00x00y
。(tmp>>3+i)
将这些数字转换为x
,然后i)
首先将这些数字转换为y00
/y0
或y
,然后右移以获得y
。将两部分相加,得到所需的数值。这应该可以:
mask = 0b100100
for i in range(2, -1, -1):
tmp = x & mask
print(((tmp >> 3 + i) << 1) + ((tmp & (1 << i)) >> i))
mask >>= 1
mask=0b100100
对于范围(2,-1,-1)内的i:
tmp=x&mask
打印(((tmp>>3+i)i))
掩码>>=1
第一个掩码仅提取a
和d
,然后将其移动到仅提取b
和e
,然后是c
和f
在
print
语句中,数字为x00y00
或0x00y0
或00x00y
。(tmp>>3+i)
将这些数字转换为x
,然后i)
首先将这些数字转换为y00
/y0
或y
,然后右移以获得y
。将这两部分相加,得到所需的xy
数字。如果使用字符串(bin(x)
),则切片将起作用
如果您使用字符串(
bin(x)
),切片将起作用
如果您使用字符串(
bin(x)
),切片将起作用
如果您使用字符串(
bin(x)
),切片将起作用
回答得很好,谢谢。您能否指出如何有效地为其他分区生成掩码,例如15位到3位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)
回答得好,谢谢。您能否指出如何有效地为其他分区生成掩码,例如15位到3位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)
回答得好,谢谢。您能否指出如何有效地为其他分区生成掩码,例如15位到3位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)
回答得好,谢谢。您能否指出如何有效地为其他分区生成掩码,例如15位到3位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)