「010110」などの2進数を表すユニコード文字列のリストがあります。
ビット単位の操作を実行したいのですが、これらをビット単位の操作を実行できる構造体 (できれば unsigned int) に変換するにはどうすればよいですか?
「010110」などの2進数を表すユニコード文字列のリストがあります。
ビット単位の操作を実行したいのですが、これらをビット単位の操作を実行できる構造体 (できれば unsigned int) に変換するにはどうすればよいですか?
int()
「base」オプションとともに使用します。
int("010110", 2)
文字列を int に変換してから、通常のシフト演算子を使用できます。
>>> 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
int(x,2) はおそらくまだ最善の策ですが、それを使用している場合の最適化のための他のアイデアです。