0

「010110」などの2進数を表すユニコード文字列のリストがあります。

ビット単位の操作を実行したいのですが、これらをビット単位の操作を実行できる構造体 (できれば unsigned int) に変換するにはどうすればよいですか?

4

3 に答える 3

4

int()「base」オプションとともに使用します。

int("010110", 2)
于 2013-10-03T09:51:12.833 に答える
3

文字列を int に変換してから、通常のシフト演算子を使用できます。

>>> x = int("010110", 2)
>>> x >> 3
2
>>> x << 3
176
于 2013-10-03T09:51:17.730 に答える
0

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

int(x,2) はおそらくまだ最善の策ですが、それを使用している場合の最適化のための他のアイデアです。

于 2013-10-03T13:20:16.350 に答える