Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中转换整数位的有效方法?_Python_Bit Manipulation - Fatal编程技术网

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

在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

考虑一个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 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)