0


0

次のような800行のファイルがあります。

id binary-coded-info --------------------------- 4657 001001101 4789 110111111など

各0または1は、何らかの機能の存在を表します。 このファイルを読んで、binary-coded-infoに対していくつかのビット単位の論理演算を行いたい(演算はユーザー入力と3000行の2番目のファイルからの情報に依存する)。 それから、これらの再計算された2進コード化情報はファイルに書かれるべきである(末尾のゼロと共に、例えば。

4657 000110011 4789 110110000など

独自の基本変換ルーチンを書かずにどうすればよいでしょうか。 私は、Python、perlなどのように、私は何もしていない、私は知らない言語にもオープンです。 そしてそれはコンパイルせずに動作するはずです。

これまでのところ、私は自分のやり方でスクリプトを作成し、awkし、そしてsedしようとしました。 これは(私は思う):base-2としてバッチ読み込み、base-10に変換し、ユーザー入力と2番目のファイルに応じてビット単位の操作を行い、base-2に変換し、先行ゼロを追加して印刷します。 私はファイルに多くの行を持っているので、bcを使用する通常のコンソールのヒントはエレガントには見えません。 dc.sedについても同じことが言えます。 そしてawkは( "echo $((2#101010))"のように)入力にバイナリのフラグを立てるのと同じことをしていないようで、またprintfのトリックはバイナリに対しては機能しません。 それでは、どのようにしてこれを最もエレガントに(または、まったくそのために)行うのでしょうか。

6 Answer


3


なぜそれらを変換してビット演算を使うのですか?

Pythonでは、これらすべてを文字列として実行できます。

myFile:keyのvalue = line.split()bits = list(value)#bitsは1文字の文字列のリストになります['1'、 '0'、 '1'、...]#。 .. ビットに何かをする... 印刷キー、 ""。join(値)


1


Pythonでは、base 2を指定してintを使ってバイナリに変換することができます。 ie:

>>> int('110111111',2)
447

変換し直すには、python2.6または3には `bin`関数がありますが、python2.5にはないので、それを自分で実装する必要があります(または、以下のようなものを使用する)

def bin(x, width):
    return ''.join(str((x>>i)&1) for i in xrange(width))[::-1]

>>> bin(447, 9)
110111111

(幅は埋め込む桁数です - あなたの例は9ビットの数字を使っているようです。)


0


C言語で既に変換している場合は、C言語で変換を行うために "strtol(str、NULL、2)"を使用できます。

次のようなものがうまくいくでしょう。

FILE * f = fopen( "myfile.txt"、 "r"); char行[1024]。 while((line = fgets(line、sizeof(line)、f)){char * p; long column1 = strtol(line、) }

エラー処理などを追加する必要があります。


0


"単純な" Perl oneライナー(foo bar baz quuxをあなたのフラグに置き換えてください)

perl -le '@ f = qw / foo bar baz quux /; $ _

これは読みやすいPerlのバージョンです。

#!/ usr / bin / perl

厳密を使用してください。警告を使用します。

オンとオフを切り替えることができる#flags、最初の#flagは左端のビットでオン/オフされます。 "5番旗"、 "6番旗"、 "7番旗"、 "8番旗"、

#コマンドライン引数を個々の#onesと0にします。my @bits = split //、shift;

#ビットが1の場合、そのビットとともに#フラグを表示して、ビットをループします。my $ i = 0;私の$ bit(@bits){if($ bit){print "$ flags [$ i] \ n"; $ i; }


0


ブライアンの答えを拡大する:

#単純にするために '----'行を取り除きますdata_file = '' 'id binary-coded-info 4657 001001101 4789 110111111' '' import cStringIO import csv、sys data = []#行辞書のリスト( #csvモジュールを使ってファイルを読み込む#各行は、最初の行に対応するキーを持つ辞書になります。reader = csv.DictReader(cStringIO.StringIO(data_file)、delimiter = ''、skipinitialspace = True)試してみてください。リーダー内の行に対して:data.append(row)#csv.Errorを除く行リストをデータリストに追加します。e:sys.exit( 'file%s、line%d:%) s '%(filename、reader.line_num、e))#first = int(data [0] [' binary-coded-info ']、2)#で最初のビット文字列をassert(first)

詳細については のpythonドキュメントを、http://docs.python.org/library/csv.html#moduleをご覧ください。 csvモジュールの詳細については、-csv [csv module]を参照してください。


0


そして長い伝統に従って、これがawkバージョンです:-) gawk 4.0.1での最後のチェック他のawkでも同様に動作するはずです。

{var = _int( "00010101"、2); print _bin(または(var、_int( "00101001"、2))、8)print _bin(and(var、_int( "10110111"、2))、8)print _bin(xor(var、var)、8) ; }

#varをd-ht baseに変換します。 16進数には16、8進数には8などを指定します。 さらにベース36のベース36までは、Xを指定してください。 d <= 36でカスタムXを使いたい場合は、iに1を指定します。 function _obase(v、d、X、i、this、r){if(d <= 9){r = ""; while(v){r = v%d "" r; v = int(v / d) (d <= 36の場合)r;}を返す カスタムXを使用する場合は、1からiまでの関数_int(s、d、X、i、this、k、r){r = 0; k = length(s); if(d <= 9){( i = 1; i <= k; i){r * = d; r = r int(substr(s、i、1));} return r;} if(d <= 36)

ある種のawkではfunction and()、()、xor()が欠けているかもしれません。 もしそうなら、ビット操作libsをロードしてください。 ネットに浮かぶawkのためのいくつかがあります。 またはあなた自身を提供してください。