Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对于c中的大字符串,按位或在字符串上#_C#_String_Bitwise Or - Fatal编程技术网

C# 对于c中的大字符串,按位或在字符串上#

C# 对于c中的大字符串,按位或在字符串上#,c#,string,bitwise-or,C#,String,Bitwise Or,我有两个长度相等的字符串(1和0)( 我有两个长度相等的字符串(1和0)(这是最快的方式: 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(); s

我有两个长度相等的字符串(1和0)( 我有两个长度相等的字符串(1和0)(这是最快的方式:

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();
string x=”“;
字符串y=“”;
StringBuilder sb=新的StringBuilder(x.长度);
对于(int i=0;i
您可以使用查询压缩并聚合结果:

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

基本上,扩展方法采用两个序列,并对两个序列的每个对应元素应用一个操作。然后我使用从
char
转换到
String
,最后我从一个字符串序列(0和“1”)得到结果因为有人提到速度是一个重要因素,所以最好使用位操作

请看一个:

  • 字符
    '0'
    是二进制的
    0x30
    ,或
    00110000
  • 字符
    '1'
    是二进制的
    0x31
    00110001
只有字符的最后一位不同。因此,我们可以放心地说,对字符本身执行按位OR将生成正确的字符

我们可以做的另一件重要事情是优化速度,即使用一个初始化为字符串初始容量的字符串。或者更好:我们可以将其重新用于多个操作,尽管我们必须确保具有足够的容量

考虑到这些优化,我们可以采用以下方法:

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();
}
string BinaryStringBitwiseOR(字符串a、字符串b、StringBuilder StringBuilder=null)
{
如果(a.长度!=b.长度)
{
抛出新ArgumentException(“给定字符串参数的长度不匹配”);
}
如果(stringBuilder==null)
{
stringBuilder=新的stringBuilder(a.长度);
}
其他的
{
stringBuilder.Clear().EnsureCapacity(a.Length);
}
for(int i=0;i

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

我发现这比所有建议的解决方案都要快。它结合了@Gediminas和@Sakura答案中的元素,但使用了预初始化的
字符[]
而不是
StringBuilder

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

string x = ...
string y = ...
char[] c = new char[x.Length];
for (int i = 0; i < x.Length; i++)
{
    c[i] = (char)(x[i] | y[i]);
}
string result = new string(c);
字符串x=。。。
字符串y=。。。
char[]c=新字符[x.Length];
对于(int i=0;i
您尝试过什么?最明显的解决方案有什么问题(读取每个字符或它,然后将其写入新字符串)你可以使用StringBuilder和Road。看看我的答案。首先,你是如何得到字符串的?如果你在寻找性能,最好考虑一下是否可以使用另一个数据。structure@Rotem,是的,我做了最明显的事情,但我关心的是性能。@KooKiz,我从源文件中读取它作为字符串。我必须处理apx,250000个字符串,每个长度为500。这会降低我的性能。@Reddy您应该编辑原始问题并包含这些信息-知道您需要性能非常重要,您将运行250000次而不是一次。@Reddy您能更改数据结构吗?如果可以并且想要性能,请不要使用字符串。使用位掩码算法的
int
array或使用
BitArray
谢谢您提供的代码片段。我可以使用“|”吗“逻辑”还是“偶然”?@Reddy logical OR | |是为布尔定义的,而不是为布尔定义的characters@Reddy
|
仅用于波伦数和按位数,而不用于字符和字符串。@M.kazemAkhgary,除了这个答案+字符串的并行处理。@Sakura,这取决于输入是否包含更多的
0
或更多的
1
。如果h字符串都是零,使用
|
会比较慢。按位需要速度。这种方式很慢。@Sakura您需要在字符的字节级别上进行按位操作吗?嗯,我不确定这会是直接的,因为您必须处理Unicode/Ascii/UTF-8、UTF-16等。您使用的是特定的格式/区域性吗?我们有什么方法吗关于字符串的逐位运算???@Reddy嗯,我们不能对整个字符串执行逐位运算,但我们可以对字符串的每个字符执行逐位运算。每个字符由一个或多个字节表示(取决于编码-ASCII/Unicode,然后是UTF-8、UTF-16等)。因此,理论上我们可以对字符的字节执行逐位操作。但是,我们应该知道确切的编码,这样我们就可以仅屏蔽表示字符的相关位(其他位用于编码)。是的,这是最好的。不安全代码呢?它能更快吗?根据我的测试,如果我们最终不需要转换回
string
,不安全代码可以更快。否则它会更慢,未更改的->托管转换到
string
会占用一半的时间。从asker的一条评论中,他从文件中读取字符串。对于speci在这种情况下,他可以直接读取字节数组并按位执行。
字符串
是Unicode/UTF-16代码单元的计数序列(
char
),因此您最好查看并理解UTF-16编码,而不是查看ASCII表。在这种情况下,Unicode代码点为“0”和“1”每个都有一个UTF-16代码单元,->0x0030和->0x0031。