2010-12-06 7 views
0

alt text比較ビット(一度に一つの位置)

は当初私は、ユーザー入力進数(0から15)を有し、そしてIは二進数にそれを向けるだろう。 図に示すように、これらの番号がテキストファイルに書き込まれているとします。これらの数字は、1の数で並べられています。ダッシュは1の異なるグループを区切るために使用されます。

私はこのファイルを読んで、1つのグループの文字列をグループのすべての文字列、つまりグループ1とグループ2のすべての文字列と比較しなければなりませんグループ2 - グループ3

0/1差の1つの列のみが許可され、その列は文字tで置き換えられます。複数の列に差がある場合は、noneを書きます。 グループ2、0001、グループ3、0011と言うと、2番目の列だけが異なります。ただし、0010と0101は2列の差分です。

結果を別のファイルに書き込まれます.....瞬間

、私はこれらの文字列を読んでいたとき、私はベクトル文字列を使用しています。私はビットセットを見つけました。重要なのは、キャラクタに一度に1つずつアクセスしなければならないということです。つまり、ベクトルの文字列をベクターの文字に分割していることを意味します。しかし、より簡単な方法があるようです。

私はさらにハッシュテーブルリンクリストを考えました。グループ1をH [0]に割り当てる。各比較は、H [current_group + 1]でH [current-group]として実行されます。しかし、最初の比較(1と0の比較)以外にも、このハッシュ連動の仕方では比較できません。だから私はそれをあきらめました。

#include <iostream> 
#include <fstream> 
#include <vector> 
#include <string> 
#include <algorithm> 
#include <iterator> 
using namespace std; 

int main() { 
    ifstream inFile("a.txt"); 
    vector<string> svec; 
    copy(istream_iterator<string>(inFile), istream_iterator<string>(), back_inserter(svec)); 
    copy(svec.begin(), svec.end(), ostream_iterator<string>(cout,"\n")); 
    for(int i = 0; i < svec.size(); i++) 
    { 
    cout << svec[i] << " "; 
    } 
    inFile.close(); 

    return 0; 
} 

すべてのヘルプは高く評価されて....これは、ファイルに書き込むのサンプルコードです....しかし、私が言ったように、ベクトルの全体の契約は、私の場合は非現実的と思われます。おかげ

+1

「宿題」と非常によく似ています。ヒント:ビット単位の操作、特にXORが役立ちます。 – mjv

+0

はい私はそれについても考えました。実際、それは私の心の中で最初に起こったことでした。問題はストレージです。リマインダーのおかげで、私は戻って追加しました。 – CppLearner

+0

あまりよく知られていませんが、ビット単位で増分しました。 – CppLearner

答えて

1

私はコードスニペットを理解していません - それは入力ファイルで文字列のベクトルに読み込まれ、空白で区切られた各単語が別の文字列に含まれるように見えます2つの異なる方法で(1回は\nで区切られ、1つはスペースで区切られています)。

必要な計算を行うのではなく、ファイル自体を読んで解釈することが主な問題です。私はこの答えがあなたに役立つことを願っています。

私はファイルの行構造が重要だと思います - そうですか?その場合は、global getline() function in the <string> headerを使う方が良いでしょう。これは、空白で区切られた単語ではなく、行全体を文字列に読み込みます。 (実際には、関数はかなり隠されていると思われます)また、実際にはすべての行をベクトルに読み込んで処理する必要はありません - より効率的で実際には数字やビットセットに簡単に切り抜ける方が簡単です:

vector<unsigned> last, curr; // An unsigned can comfortably hold 0-15 
ifstream inf("a.txt"); 

while (true) { 
    string line; 
    getline(inf, line); // This is the group header: ignore it 
    while (getline(inf, line)) { 
     if (line == "-") { 
      break; 
     } 

     // This line contains a binary string: turn it into a number 
     // We ignore all characters that are not binary digits 
     unsigned val = 0; 
     for (int i = 0; i < line.size(); ++i) { 
      if (line[i] == '0' || line[i] == '1') { 
       val = (val << 1) + line[i] - '0'; 
      } 
     } 

     curr.push_back(val); 
    } 

    // Either we reached EOF, or we saw a "-". Either way, compare 
    // the last 2 groups. 
    compare_them_somehow(curr, last); // Not doing everything for you ;) 
    last = curr; // Using swap() would be more efficient, but who cares 
    curr.clear(); 
    if (inf) { 
     break; // Either the disk exploded, or we reached EOF, so we're done. 
    } 
} 
0

はおそらく、私はあなたの目標を誤解しましたが、文字列は配列メンバーの比較に適している:

string first = "001111"; 
string next = "110111"; 
int sizeFromTesting = 5; 
int columnsOfDifference = 0; 

for (int UU = sizeFromTesting; UU >=0; UU--) 
{ 
    if (first[ UU ] != next[ UU ]) 
     columnsOfDifference++; 
} 
cout << columnsOfDifference; 
cin.ignore(99, '\n'); 
return 0; 

代替ファイルストリームおよび結合した保護適切な。

該当しませんが、文字通りビット単位の比較変数&には、それぞれの桁にマスクを使用します(2桁目は000010)。 0または0の場合、これらは一致します。両方とも0です。または1または& = 1の場合、その数字は両方とも1です。そうでなければ、それらは異なる。グループ内のすべてのビットとすべての数字について繰り返します。 vb.netで

0

'group_0 with group_1 
      If (group_0_count > 0 AndAlso group_1_count > 0) Then 
       Dim result = "" 
       Dim index As Integer = 0 
      Dim g As Integer = 0 
      Dim h As Integer = 0 
      Dim i As Integer = 0 

      For g = 0 To group_0_count - 1 
       For h = 0 To group_1_count - 1 
        result = "" 
        index = 0 
        For i = 0 To 3 
         If group_1_0.Items(g).ToString.Chars(i) <> group_1_1.Items(h).ToString.Chars(i) Then 
          result &= "-" 
          index = index + 1 
         Else 
          result &= group_1_0.Items(g).ToString.Chars(i) 
         End If 
        Next 
       Next 
      Next 
     End If 
0

整数としてそれを読んで、あなたが必要とする必要があるすべてはbitshiftsとビットマスクとの比較です。

関連する問題