【问题标题】:Bitwise operations on strings - 1440 characters length字符串的按位运算 - 1440 个字符长度
【发布时间】:2012-12-31 12:46:55
【问题描述】:

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

【问题讨论】:

  • 为什么你的数字以字符串开头?如果这与 stackoverflow.com/questions/14095943/… 相关,请注意将数字作为字符串处理是非常低效的。
  • @MattiVirkkunen 感谢您的警告。实际上这是一种散列和散列检查操作。所以我们可以说点别的。
  • 我也尝试了 int64 的答案,但数字仍然太大。

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


【解决方案1】:

Convert先到实际位,再做位比较。

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

int result = num1 & num2;

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

【讨论】:

  • OP:这个答案比我的答案快了大约一分钟。
  • 感谢您的回答,但我的字符串长度是 1440 个字符,所以我想您的解决方案会失败
  • 你可以在一开始就这么说,不是吗?
【解决方案2】:

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

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

这是一个关于如何从任何基数的字符串构造 BigInteger 的问题 - BigInteger Parse Octal String?

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

【讨论】:

  • 好的,您的解决方案可以工作,但是在您执行 & 操作之后,您将如何再次将该大整数转换为位数组:D
  • @MonsterMMORPG - 搜索应该提供几种方法 - 我最近在 SO 上看到了几种解决方案。我会转换为字节,而不是根据需要用“0”连接每个字节+填充的字符串表示。
  • 是的,我需要这些。但毕竟你的解决方案(包括转换为字节,然后用 pad 0 连接每个字节的字符串)或者我的脏解决方案工作得更快吗? 5000 个字符长 :)
【解决方案3】:

你必须先将字符串转换为数字,你可以使用“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;

希望对你有帮助。

【讨论】:

  • 感谢您的回答,但我的字符串长度是 1440 个字符,所以我想您的解决方案会失败
【解决方案4】:

您不能按照您想要的方式对字符串进行按位运算。您可以通过对具有其他目标的字符串进行按位运算来做一些有趣的事情,例如更改它们的大小写,但我认为这就是您想要的:

// 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 个字符,所以我想您的解决方案会失败
  • 我第一次阅读您的问题时没有说明异常长的字符串长度。
【解决方案5】:

我喜欢 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”库的不同类中提供的函数,并且不会直接编译。我已经更新了链接以在代码中提供此类......希望这是唯一的情况,但如果没有,请告诉我,我可以修复。

【讨论】:

    猜你喜欢
    • 2019-04-21
    • 2011-02-09
    • 1970-01-01
    • 2014-04-08
    • 1970-01-01
    • 2020-08-14
    • 2019-11-29
    • 1970-01-01
    • 2011-07-29
    相关资源
    最近更新 更多