C#中的_BitScanForward?

我正在将用C ++编写的程序翻译成C#,并且我遇到了一个我无法解决的内在函数。 在C ++中,这被称为:

unsigned char _BitScanForward(unsigned long * Index, unsigned long Mask); 

如果我只知道内部函数所在的DLL(如果有的话),我可以使用P / Invoke。 由于我不知道,我在.NET框架中寻找替代方案,但我空手而归。

有谁知道如何在_BitScanForward上使用P / Invoke,或者做同样事情的.NET方法?

感谢任何帮助,谢谢。

内部函数不在任何库中,它们是在CPU内部实现的,编译器会发出CPU识别为唤起这种特定行为的机器代码 。

它们是一种获取没有简单C等效指令的方法。

直到.NET优化器变得足够智能才能识别它们(例如,Mono JIT识别一些SIMD指令,在MSIL中编码为对特定类的函数的调用,类似地,.NET JIT用浮动替换对System.Math方法的调用 – 点操作),你的C#代码注定要比原来的C ++运行一个数量级。

_BitScanForward C ++函数是一个内部编译器函数。 它找到从最低位到最高位的字节序列中的第一个位,并返回该位的值。 您可以在C#中使用位操作策略实现类似的操作(尽管它永远不会接近相同的性能)。 如果您对C ++中的位操作感到满意,那么它在C#中基本相同。

_BitScanForward搜索整数中的第一个设置位,从最低有效位搜索到最高有效位。 它编译为x86平台上的bsf指令 。

这个讨厌的黑客页面包含了一些在不同情况下表现优异的潜在替代算法。 有一个O(N)函数(一半的时间,均匀分布的输入只返回一次迭代)和一些子线性选项,还有一些利用乘法步骤。 挑选一个可能不是微不足道的 ,但任何都应该有用。

P / Invoke _BitScanForward是不可能的,因为它是编译器内在的,而不是实际的库函数(它由Visual C ++编译器转换为BSF x86机器指令)。 据我所知,这个“查找第一组”操作没有MSIL指令。 最简单的方法是编写自己的C ++本机DLL,导出一个调用_BitScanForward()的函数,然后P / Invoke。

您也可以使用位操作直接在C#中编写它(请参阅算法,以便在Wikipedia中查找第一组 )。 我不确定这是否会比P / Invoke更快或更慢。 测量并找出答案。