0

(1,3,6) のように 2 進数を実 2 進数として表現するリストを表現しようとしてい0b100101ます。まず、それらを 2^1+2^3+2^6 として合計してから、バイナリに変換しようとします

with open('DATA.txt') as f:
    for line in f:
            myLine=line.rstrip().split("\t")
            print [bin(2**int(l)) for l in myLine[1:5]]

a以下のようなリストに変換したところ

>>> a=['0b10000000000000000000000000', '0b100000000000', '0b100000000000000000000000000000']
>>> a[1]|a[2]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for |: 'str' and 'str'
>>> bin(a[1])+bin(a[2])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object cannot be interpreted as an index

そう

べき乗ベクトルを 2 進数に変換するにはどうすればよいですか。つまり、べき乗 2 進数表現から実際の 2 進数表現に変換するにはどうすればよいですか?

簡単な例

入力

['0b10000000000000000000000000', '0b100000000000', '0b100000000000000000000000000000']

意図した出力

0b100010000000000000100000000000
4

2 に答える 2

2

binビルトインによって返される値は単純な文字列です。「2進数」ではありません。2 進数は存在しません。数値の 2 進数表現のみがあります。Python の整数は、内部的に基数 2 として表されます。bin関数は、この (実際には、2 の補数ではなく、モジュラスと符号の表現) 表現を文字列として「見る」ことができます。

これらの文字列に対してビット単位の操作を実行する|場合は、それらを整数に変換してから文字列に戻す必要があります。

In [7]: bin(int('0b10000', 2)|int('0b100', 2))
Out[7]: '0b10100'

バイナリ文字列のリストが与えられた場合、これらの文字列を組み合わせた数値を取得したい場合は、次のreduce関数を使用できます。

In [8]: import operator as op

In [9]: from functools import reduce

In [10]: a = ['0b10000000000000000000000000', '0b100000000000', '0b100000000000000000000000000000']

In [13]: bin(reduce(op.or_, (int(num, 2) for num in a)))
Out[13]: '0b100010000000000000100000000000'
于 2013-09-04T14:07:06.790 に答える
1

バクリウは何が起こっているのかを非常にうまく説明したので、これを簡単に説明します. あなたの問題の解決策は

with open('DATA.txt') as f:
    for line in f:
        myLine=line.rstrip().split("\t")
        print sum(2**int(l) for l in myLine[1:5])

合計はバイナリに等しいことに注意してください。または、異なるビットのみが設定されている限り、ここではそうであると想定しています。

于 2013-09-04T15:48:08.887 に答える