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)”,第二个参数让您指定基数:

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

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

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

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

这是BoolArray 源代码。但是请注意,它还不是很完整,也没有经过全面测试,但我没有立即意识到任何错误。

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

于 2012-12-31T04:46:55.730 回答
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 回答