3

C#で文字列に対してビット演算を行うにはどうすればよいですか?

string sr1="0101110";
string sr2="1101110";

sr1 & sr2="0101110";

また

sr1 | sr2="1101110";

どうすればそのような比較を行うことができますか?

文字列の長さが1440文字に固定されていることに注意してください

ここに私の汚い解決策

    private string compareBitWiseAnd(string sr1, string sr2)
    {
        char[] crArray1 = sr1.ToCharArray();
        char[] crArray2 = sr2.ToCharArray();
        StringBuilder srResult = new StringBuilder();

        for (int i = 0; i < crArray1.Length; i++)
        {
            if (crArray1[i] == crArray2[i])
            {
                srResult.Append(crArray1[i]);
            }
            else
            {
                srResult.Append('0');
            }
        }

        return srResult.ToString();
    }

    private string compareBitWiseOr(string sr1, string sr2)
    {
        char[] crArray1 = sr1.ToCharArray();
        char[] crArray2 = sr2.ToCharArray();
        StringBuilder srResult = new StringBuilder();

        for (int i = 0; i < crArray1.Length; i++)
        {
            if (crArray1[i] == '1' || crArray2[i] == '1')
            {
                srResult.Append("1");
            }
            else
            {
                srResult.Append('0');
            }
        }

        return srResult.ToString();
    }
4

5 に答える 5

3

最初に実際のビットに変換してから、ビット単位の比較を行います。

int num1 = Convert.ToInt32(sr1, 2);
int num2 = Convert.ToInt32(sr2, 2);

int result = num1 & num2;

からバイナリ文字列を取得する場合は、これを使用しますresult

于 2012-12-31T01:18:10.230 に答える
2

最初に文字列を数値に変換する必要があります。「Convert.ToInt32(String、Int32)」を使用できます。2番目のパラメータを使用すると、ベースを指定できます。

string sr1 = "0101110";
string sr2 = "1101110";

int one = Convert.ToInt32(sr1, 2);
int two = Convert.ToInt32(sr2, 2);

int result = one & two;

それが役に立てば幸い。

于 2012-12-31T01:20:54.893 に答える
2

BigIntegerあなたが探しているタイプです。BitwiseOrもあります。

本当に文字列に固執する必要がある場合は、文字ごとにビット単位の演算を計算することはそれほど難しくありません...しかし、可能であればそれを避けるようにします。

BigIntegerそして、ここに任意の基数の文字列から構築する方法に関する質問があります-BigInteger Parse Octal String?

var bitString = "10101";
BigInteger value = bitString.Aggregate(new BigInteger(), (b, c) => b * 2 + c - '0');
于 2012-12-31T01:45:11.510 に答える
1

意図した方法で文字列に対してビット演算を実行することはできません。大文字と小文字を変更するなど、他の目標を持つ文字列のビット演算で実行できる興味深いことがありますが、これが必要なことだと思います。

// Convert the string to an integer

int foo = Convert.ToInt32(sr1, 2);
int bar = Convert.ToInt32(sr2, 2);

// Perform binary styff
int result = foo & bar;

// Convert back to a string, if you want
string resultStr = result.ToString();
于 2012-12-31T01:19:37.830 に答える
1

AlexeiのBigIntegerソリューションは気に入っていますが、最低でも.NET4.0が必要です。何らかの理由でそれを使用できない場合、別のオプションは、BitArray.NET1.1以降で使用可能になっているクラスを使用することです。残念ながら、BitArrayバイナリ文字列を解析するためのメソッドが組み込まれていないため、Alexeiのソリューションと同様に、手動で解析する必要があります。

もう1つのオプションは、と呼ばれるクラスですBoolArray。これは、と多くの同じことをBitArray行いますが、バイナリ文字列を解析するメソッドがあります。静的BoolArray.FromBinaryStringメソッドを使用します。

BoolArray bin = BoolArray.FromBinaryString("1001011000111010101");   // etc

これがBoolArrayのソースコードです。ただし、完全ではなく、完全にテストされていないことに注意してください。ただし、バグについてはすぐにはわかりません。

編集:元のリンクを貼り付けた後、コードが「Utils」ライブラリの別のクラスで提供されている関数を使用しており、直接コンパイルされていないことに気付きました。このクラスをコードで提供するようにリンクを更新しました...うまくいけばそれが唯一のケースでしたが、そうでない場合は知らせてください。修正できます。

于 2012-12-31T04:46:55.730 に答える