Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.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_Optimization_Bit Manipulation - Fatal编程技术网

C# 位相等

C# 位相等,c#,c,optimization,bit-manipulation,C#,C,Optimization,Bit Manipulation,我需要在两个字节之间执行位相等。这意味着,例如,如果我有两个字节:0001011和00011110,结果是11111010 我看到的唯一快速方法是使用以下语句 byte a, b;//set input bytes byte c = ~(a^b);//output bytes 但我想知道是否有更快的解决办法。在这些相等操作之后,我想屏蔽我需要的位。所以我需要使用AND操作。因此,代码变成: byte a, b;//set input bytes byte m;//mask, intrestin

我需要在两个字节之间执行位相等。这意味着,例如,如果我有两个字节:0001011和00011110,结果是11111010 我看到的唯一快速方法是使用以下语句

byte a, b;//set input bytes
byte c = ~(a^b);//output bytes
但我想知道是否有更快的解决办法。在这些相等操作之后,我想屏蔽我需要的位。所以我需要使用AND操作。因此,代码变成:

byte a, b;//set input bytes
byte m;//mask, intresting bits are set to 1, others to 0
byte c = (~(a^b))&m;//output bytes

难道没有任何更快、更简单的方法不需要使用所有这些按位操作吗?因为这部分代码会被频繁调用。

我怀疑它能在更少的操作中完成。这看起来很理想。也许您可以将~(a^b)存储在查找表中(256*256个条目)?我怀疑你会得到多少好处,甚至可能让事情变得更糟,但你可以试试。

老实说,这些操作似乎足够快。我认为您不应该尝试进一步优化它们,而是首先完成您的软件,看看您是否对总体性能满意,如果不满意,请使用探查器。我敢肯定问题会出在别处。

您需要的是XNOR操作。不幸的是,C#/Mono不支持这一点。我认为您的解决方案是最佳的。

您在错误的地方寻找此优化;在这里,您不会找到更好的按位操作。即使你这样做了,它也不会加速任何事情。真正的胜利将来自于一次处理超过一个字节的数据。处理器已经不得不进行一系列的位移位和掩蔽操作,这样它就可以假装您正在处理字节。一次处理一个字的字节数组,或者使用矢量指令(如果有的话)。

我使用Mono/C#.Net,但C系列中任何语言的语法都是等效的,我认为这没那么重要。比按位运算快吗?你一定是开玩笑吧?等等。你想要比两个位操作更快的东西,两个直接实现你描述的语义的操作?哈?为什么你认为你的语言的运算符==不够好?像这样的按位运算通常非常快-你有什么证据表明你需要优化它们?你有基准测试吗?从理论上讲,~(a^b)可能会更快。它可能需要两个周期和管道执行。那么,对内存的索引查找可能需要几个周期。OP应该注意,编译器为索引表而执行的操作可能至少与直接计算结果的操作一样昂贵(可能更昂贵)。这不考虑额外的内存访问。缓存未命中比算术运算慢2个数量级。当查找表和实际输入字节数组适合于同一缓存线时,此操作应该非常快。然而,我希望a~(a^b)也能同样快(甚至可能是由JIT编译器优化的)。如果MS-JIT编译器能够将a~(a^b)优化为XNOR,我也不会感到惊讶。CommuSoft应该查看生成的汇编代码,看看是否是这样。这是一个好主意。我想知道这是否也得到了优化。我在VS2008中打开了Debug/Windows/Disassembly窗口,查看生成了什么程序集,看到了一个XOR语句和一个NOT语句。这意味着它没有得到优化。然而,我们讨论的只是两个汇编指令:这是惊人的快。这太糟糕了。谢谢你的调查。