python将二进制字符串转换为可用于位运算符的结构

python将二进制字符串转换为可用于位运算符的结构,python,binary,type-conversion,Python,Binary,Type Conversion,我有一个代表二进制数的unicode字符串列表,例如010110 我希望执行逐位运算,那么如何将其转换为一种结构,在这种结构中,我可以对这些数据执行逐位运算,最好是一个无符号int?将int与base选项一起使用 int("010110", 2) 可以将字符串转换为int,然后对其使用常规shift运算符: >>> x = int("010110", 2) >>> x >> 3 2 >>> x << 3 176 使

我有一个代表二进制数的unicode字符串列表,例如010110

我希望执行逐位运算,那么如何将其转换为一种结构,在这种结构中,我可以对这些数据执行逐位运算,最好是一个无符号int?

将int与base选项一起使用

int("010110", 2)

可以将字符串转换为int,然后对其使用常规shift运算符:

>>> x = int("010110", 2)
>>> x >> 3
2
>>> x << 3
176

使用int是最明显、最有用的方法。但你没有说你是否需要这些整数

以防万一,那么:

x = '1010100100'
intx = int(x,2)
x
0x2a4
intx >> 5
0x15
bin(intx>>5)
'0b10101'
x[:-5]
'10101'

intx << 3
0x1520
bin(intx<<3)
'0b1010100100000'
x + '0'*3
'1010100100000'
实际的变化是缓慢的,但最终的结果不一定,也没有你想象的那么慢。这是因为,即使在大多数现代体系结构上,实际的转换可能只是一个周期,而一个片段显然是更多的指令,但仅仅查找参数等就有很多开销,这并没有太大的区别

# Shifts are about 40% faster with integers vs. using equivalent string methods
In [331]: %timeit intx>>5
10000000 loops, best of 3: 48.3 ns per loop

In [332]: timeit x[:-5]
10000000 loops, best of 3: 69.9 ns per loop

In [333]: %timeit x+'0'*3
10000000 loops, best of 3: 70.5 ns per loop

In [334]: %timeit intx << 3
10000000 loops, best of 3: 51.7 ns per loop

# But the conversion back to string adds considerable time,
# dependent on the length of the string
In [335]: %timeit bin(intx>>5)
10000000 loops, best of 3: 157 ns per loop

In [338]: %timeit bin(intx<<3)
1000000 loops, best of 3: 242 ns per loop

# The whole process, including string -> int -> shift -> string,
# is about 8x slower than just using the string directly.
In [339]: %timeit int(x,2)>>5
1000000 loops, best of 3: 455 ns per loop

In [341]: %timeit int(x,2)<<3
1000000 loops, best of 3: 378 ns per loop

intx,2可能仍然是您的最佳选择,但如果您使用过它,则可以使用其他一些优化方法

@Jon谢谢,习惯加一个;很难踢。