0

私のアンドゲートは、1 ビット文字列だけを使用すると機能しますが、それ以外の場合はまったく機能せず、「特定の引数が有効な値の範囲外でした。パラメータ名: startIndex」と表示されます。

ここで私が間違っていることを知っている人はいますか?文字列の末尾に追加するより良い方法はありますか? ありがとう!

private string parsestrings(string s1, string s2)
{
    int n = s1.Length;
    int m = s2.Length;
    int l;
    string s = "";
    if (n > m)
    {
        for(int i = 0; i <= n; i++)
        {
            l = AndGate(s1[i], s2[i]);
            s.Insert(i, IntToBinary(l));
        }
    }
    else
    {
        for (int i = 0; i <= n; i++)
        {
            l = AndGate(s1[i], s2[i]);
            s.Insert(i, IntToBinary(l));
        }
    }
    return s;
}

private int AndGate(int m, int n)
{
    if (m == 1 && n == 1)
        return 1;
    if (m == 1 && n == 0)
        return 0;
    if (m == 0 && n == 1)
        return 0;
    else
        return 0;
}
4

3 に答える 3

1

ループ終了条件が間違っています。'i <= n' は、文字列の末尾から文字列インデックスを実行します。

于 2012-04-28T00:39:36.400 に答える
1

あなたの論理は少しずれているようです。の場合n > m、ループはおそらくmではなく で停止する必要がありnます。

for(int i = 0; i <= m; i++)
{
    l = AndGate(s1[i], s2[i]);
    s.Insert(i, IntToBinary(l));
}

ただし、2 番目のループは正しいようです。

2 番目の考えは、文字列の 1 文字後なので、条件i <= mはおそらく であるべきだということです。i < ms1[m]

最後に、支出者のアドバイスに従うか、StringBuilder代わりに a を使用できます。通常、文字列を継続的に追加および更新するよりも、文字列を構築する方が適しています。

于 2012-04-28T00:40:26.377 に答える
0

s.Insert新しい文字列を作成します。元の文字列は変更されません。

もしかして:

s = s.Insert ....

、またあなたのケースでは、文字列の長さが文字数ではないにもかかわらず、 までn > mずっと反復しているため、範囲外になります。ns2n

一方、LinqZip拡張メソッドを使用すると、これを 1 行で実行できます。

string.Concat(
    s1
       .Zip(s2, (c1,c2) => new {c1, c2})
       .Select(x => x.c1 == '1' && x.c2 == '1' ? '1' : '0'))
于 2012-04-28T00:34:59.010 に答える