字符串的按位运算 - 长度为1440个字符

时间:2012-12-31 01:09:24

标签: c# string bit-manipulation logical-operators operation

如何在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();
    }

5 个答案:

答案 0 :(得分:3)

首先

Convert到实际位,然后进行逐位比较。

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

int result = num1 & num2;

如果您想从result获取二进制字符串,请使用this

答案 1 :(得分:2)

您必须先将字符串转换为数字,您可以使用“Convert.ToInt32(String,Int32)”,第二个参数允许您指定基数:

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

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

int result = one & two;
希望它有所帮助。

答案 2 :(得分:2)

BigInteger是您要查找的类型。它还有BitwiseOr

如果你真的需要坚持使用字符串,那么在逐个字符的基础上计算按位运算并不是很困难......但是如果可能的话,我会避免这样做。

以下是关于如何从任意基础的字符串构建BigInteger的问题 - BigInteger Parse Octal String?

var bitString = "10101";
BigInteger value = bitString.Aggregate(new BigInteger(), (b, c) => b * 2 + c - '0');

答案 3 :(得分: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();

答案 4 :(得分:1)

我喜欢Alexei的BigInteger解决方案,但它确实需要.NET 4.0。如果由于某种原因你不能使用它,那么另一种选择是使用自.NET 1.1以来一直可用的BitArray类。不幸的是,BitArray没有内置解析二进制字符串的方法,因此您必须手动执行此操作,类似于Alexei的解决方案。

另一个选项是我写的一个名为BoolArray的类,它与BitArray做了很多相同的事情,但确实有一个解析二进制字符串的方法 - 使用静态BoolArray.FromBinaryString方法:

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

这是BoolArray source code。但请注意,它并不完整,也没有经过全面测试,但我没有立即发现任何错误。

编辑:在粘贴原始链接后,我注意到代码使用了我的“Utils”库的不同类中提供的函数,并且不会直接编译。我已更新链接以在代码中提供此类...希望这是唯一的情况,但如果不是让我知道,我可以解决。