有没有人知道如何检查C#中的cpu是否支持popcount(人口数)? C ++很简单,但尝试使用一些国际象棋代码进行C ++到C#的转换。
非常感谢。
答案 0 :(得分:4)
我还没有找到一种在C#中检测和使用特殊CPU指令的简便方法。有几个选项,没有一个很好;
我从未这样做过并实现过C#popcount;
/// <summary>
/// Count the number of bits set to 1 in a ulong
/// </summary>
public static byte BitCount(this ulong value)
{
ulong result = value - ((value >> 1) & 0x5555555555555555UL);
result = (result & 0x3333333333333333UL) + ((result >> 2) & 0x3333333333333333UL);
return (byte)(unchecked(((result + (result >> 4)) & 0xF0F0F0F0F0F0F0FUL) * 0x101010101010101UL) >> 56);
}
答案 1 :(得分:2)
欢迎使用Stackoverflow :) 我发现这个问题似乎与这个问题类似,也许你会觉得它也很有帮助。
Elegantly determine if more than one boolean is "true"
您还可以查看c#中的bit operators以及this article
-edit -
还要更直接地解决你的问题,因为c#被编译为IL而不是机器代码,你不能真正做cpu级优化。公共语言运行库中的JIT编译器能够在实际运行代码时进行一些优化,但是没有从语言本身直接访问该进程。
然而,您可以混合使用c ++和托管代码,并在那里进行低级优化,但这有点违背了转移到c#的目的
答案 2 :(得分:0)
从.NET Core 3.0开始,您可以使用Popcnt.IsSupported
来测试基础硬件支持。
或者,如果您只需要结果,请使用BitOperations.PopCount
。 BitOperations
类中的方法“在基础平台上可用时使用硬件内部函数;否则,它们使用优化的软件后备”。