c#

时间:2016-03-06 12:00:46

标签: c# string bitwise-or

我有两个长度相等的字符串(1' s和0' s),并希望对这些字符串应用逻辑OR。

我应该如何处理这个问题。我正在使用c#。

当我考虑显而易见的解决方案时,读取每个字符并应用OR |对他们来说,我必须处理apx,250000个字符串,每个长度为500。这会扼杀我的表现。

表现是我的主要关注点。

提前致谢!

5 个答案:

答案 0 :(得分:4)

这是最快的方式:

string x="";
string y="";
StringBuilder sb = new StringBuilder(x.Length);
for (int i = 0; i < x.Length;i++ )
{
    sb.Append(x[i] == '1' || y[i] == '1' ? '1' : '0');
}
string result = sb.ToString();

答案 1 :(得分:3)

由于提到速度是一个重要因素,因此最好使用逐位操作。

查看ASCII table

  • 字符'0'0x30,或00110000为二进制。
  • 字符'1'0x31,或00110001为二进制。

只有角色的最后一位不同。因此 - 我们可以有把握地说,对字符本身执行按位OR将产生正确的字符。

我们可以做的另一件重要事情是优化速度是使用StringBuilder,初始化为我们字符串的初始容量。或者甚至更好:我们可以重复使用StringBuilder进行多项操作,但我们必须确保StringBuilder有足够的容量。

考虑到这些优化后,我们可以制定这种方法:

string BinaryStringBitwiseOR(string a, string b, StringBuilder stringBuilder = null)
{
    if (a.Length != b.Length)
    {
        throw new ArgumentException("The length of given string parameters didn't match");
    }

    if (stringBuilder == null)
    {
        stringBuilder = new StringBuilder(a.Length);
    }
    else
    {
        stringBuilder.Clear().EnsureCapacity(a.Length);
    }

    for (int i = 0; i < a.Length; i++)
    {
        stringBuilder.Append((char)(a[i] | b[i]));
    }
    return stringBuilder.ToString();
}

请注意,这适用于您希望对字符串执行的所有按位操作,您只需修改|运算符。

答案 2 :(得分:2)

  

我有两个长度相等的字符串(1和0),并且会   喜欢在这些字符串上应用Logical OR。

您可以编写一个自定义逻辑OR运算符或函数,它将两个字符作为输入并生成结果(例如,如果输入字符中至少有一个为'1'则返回'1' - 否则返回'0')。将此函数应用于字符串中的每个字符。

你也可以看看这种方法。您首先需要将每个字符转换为布尔值(例如'1'对应于true),在两个布尔值之间执行OR运算,将结果转换回字符'0'或'1' - 这取决于逻辑OR的结果是否为false或者分别为真。然后只需将此操作的每个结果相互附加。

答案 3 :(得分:2)

我发现这比所有提出的解决方案都要快。它结合了@Gediminas和@Sakura的答案中的元素,但使用了预先初始化的int counter = 0; String temp = null; final int BATCH_SIZE = 1000; try (BufferedReader br = new BufferedReader(new FileReader(path)) { while ((temp = br.readLine()) != null) { text.append(temp); ++counter; /* Process In Batches */ if(counter % BATCH_SIZE == 0) { /* Prepare & Append JSON Objects */ obj = prepareAppendJSON(text.toString(), obj); /* Clear text */ text.setLength(0); } } /* Last Iteration */ obj = prepareAppendJSON(text, obj); text = new StringBuilder(); } catch (IOException ex) { ex.printStackTrace(); } 而不是char[]

虽然StringBuilder在内存管理方面很有效,但每个StringBuilder操作都需要对标记进行一些记录,并且只执行比数组索引更多的操作。

Append

答案 4 :(得分:1)

您可以使用bug report on github.com查询进行压缩,然后汇总结果:

var a = "110010";    
var b = "001110";  
var result = a.Zip(b, (i, j) => i == '1' || j == '1' ? '1' : '0')
              .Select(i => i + "").Aggregate((i, j) => i + j);

基本上,Linq扩展方法采用两个序列并对两个序列的每个对应元素应用一个动作。然后我使用Zipchar投射到String,最后我Select来自一系列字符串的结果(&#34; 0&#34;和&# 34; 1&#34;)到一个字符串。