字符串的位运算-长度1440字符

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

1
你的数字为什么一开始就是字符串?如果这与http://stackoverflow.com/questions/14095943/how-to-generate-desired-size-example-8096-long-bit-hash-codes-c-sharp有关,请注意将数字作为字符串处理非常低效。 - Matti Virkkunen
@MattiVirkkunen 谢谢你的警告。实际上这是一种哈希和哈希检查操作,所以我们可以说其他的话。 - Furkan Gözükara
我也尝试了使用int64的答案,但数字仍然太大。 - Furkan Gözükara
5个回答

3

2
这个答案比我的早了大约一分钟。 - Charles Burns
1
谢谢您的回答,但我的字符串长度为1440个字符,所以我想您的解决方案可能行不通。 - Furkan Gözükara
1
你本可以一开始就这么说的,不是吗? - Robert Harvey

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;

希望这能帮到您。

1
谢谢您的回答,但我的字符串长度为1440个字符,所以我想您的解决方案可能行不通。 - Furkan Gözükara

2
BigInteger是你要寻找的类型。它也有按位或运算符。
如果你确实需要使用字符串,那么基于字符逐个计算按位操作并不难……但如果可能的话,我会尽量避免这样做。
这里有一个关于如何从任意进制的字符串构造BigInteger的问题 - BigInteger Parse Octal String?
var bitString = "10101";
BigInteger value = bitString.Aggregate(new BigInteger(), (b, c) => b * 2 + c - '0');

好的,你的解决方案有效,但是在进行了“&”操作之后,你将如何再次将大整数转换为位数组呢? :D - Furkan Gözükara
@MonsterMMORPG - 搜索应该给出几种方法 - 我最近在SO上看到了几个解决方案。我会将其转换为字节,然后连接每个字节的字符串表示形式,并根据需要用“0”填充。 - Alexei Levenkov
是的,我需要那些。但毕竟你的解决方案(包括将其转换为字节,然后使用填充0连接每个字节的字符串)或者我的“脏”解决方案哪个更快?长度为5000个字符 :) - Furkan Gözükara

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();

谢谢你的回答,但我的字符串长度为1440个字符,所以我想你的解决方案会失败。 - Furkan Gözükara
当我第一次阅读您的问题时,并没有提到异常长的字符串长度。 - Charles Burns

1

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

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

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

这里是BoolArray源代码。但请注意,它并不完全完成,也没有完全测试过,但我目前没有意识到任何漏洞。

编辑:粘贴原始链接后,我注意到代码使用了我的“Utils”库的另一个类中提供的函数,因此无法直接编译。 我已更新链接,以在代码中提供此类…希望这是唯一的情况,如果不是,请让我知道,我可以进行修复。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接