同じ長さ (<=500) の 2 つの文字列 (1 と 0) があり、これらの文字列に論理 OR を適用したいと考えています。
これについてどのようにアプローチすればよいでしょうか。私はc#で作業しています。
明らかな解決策を考えると、各文字を読み取り、OR | を適用します。その上で、それぞれ 500 の長さの apx、250000 個の文字列を処理する必要があります。これは私のパフォーマンスを殺すでしょう。
パフォーマンスは私の主な関心事です。
前もって感謝します!
同じ長さ (<=500) の 2 つの文字列 (1 と 0) があり、これらの文字列に論理 OR を適用したいと考えています。
これについてどのようにアプローチすればよいでしょうか。私はc#で作業しています。
明らかな解決策を考えると、各文字を読み取り、OR | を適用します。その上で、それぞれ 500 の長さの apx、250000 個の文字列を処理する必要があります。これは私のパフォーマンスを殺すでしょう。
パフォーマンスは私の主な関心事です。
前もって感謝します!
これが最速の方法です:
string x="";
string y="";
StringBuilder sb = new StringBuilder(x.Length);
for (int i = 0; i < x.Length;i++ )
{
sb.Append(x[i] == '1' || y[i] == '1' ? '1' : '0');
}
string result = sb.ToString();
速度が大きな要因であると述べたので、ビット単位の演算を使用するのが最善でしょう。
ASCII テーブルを見てみましょう:
'0'は0x30、 または00110000バイナリです。'1'は0x31、 または00110001バイナリです。文字の最後の部分だけが異なります。そのため、文字自体に対してビットごとの OR を実行すると、正しい文字が生成されると安全に言えます。
速度を最適化するためにできるもう 1 つの重要なことはStringBuilder、文字列の初期容量に初期化された を使用することです。さらに良いことに、十分な容量がStringBuilderあることを確認する必要がありますが、複数の操作に再利用できます。StringBuilder
これらの最適化を考慮して、このメソッドを作成できます。
string BinaryStringBitwiseOR(string a, string b, StringBuilder stringBuilder = null)
{
if (a.Length != b.Length)
{
throw new ArgumentException("The length of given string parameters didn't match");
}
if (stringBuilder == null)
{
stringBuilder = new StringBuilder(a.Length);
}
else
{
stringBuilder.Clear().EnsureCapacity(a.Length);
}
for (int i = 0; i < a.Length; i++)
{
stringBuilder.Append((char)(a[i] | b[i]));
}
return stringBuilder.ToString();
}
これは、文字列に対して実行するすべてのビット単位の操作で機能することに注意してください|。演算子を変更するだけで済みます。
同じ長さ (<=500) の 2 つの文字列 (1 と 0) があり、これらの文字列に論理 OR を適用したいと考えています。
入力として 2 文字を取り、結果を生成するカスタム論理 OR 演算子または関数を作成できます (たとえば、入力文字の少なくとも 1 つが '1' の場合は '1' を返し、それ以外の場合は '0' を返します)。この関数を文字列の各文字に適用します。
このアプローチを見ることもできます。最初に各文字をブール値に変換し (たとえば、'1' は true に対応)、2 つのブール値の間で OR 演算を実行し、結果を文字 '0' または '1' に変換し直す必要があります (論理 OR の結果が false かどうかに応じて)。またはそれぞれtrue。次に、この操作の各結果を互いに追加するだけです。