.NET 相当于 Java 的 Integer.bitCount?
有没有类似Java的方法 Integer.bitCount(int)
或 Long.bitCount(long)
.NET Framework 中的任何位置?
(对于那些不熟悉这些 Java 方法的人)这也称为:
- 汉明权重
- 人口计数 (在硬件中实现时通常称为
POPCNT
。)
虽然那里 是 很多 实现 至 在网上找到,我想知道是否有标准库实现。
我知道这不在 BitArray
、UInt32
或 BitConverter
中,但也许有一个版本隐藏在某个地方,例如在加密函数中。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
此功能不在 .NET Framework 或 .NET Standard 中,但在 .NET Core 3.0 及更高版本中,因此包括 .NET 5.0 及更高版本,位于
System.Numerics.BitOperations
静态类,特别是方法PopCount(System.UInt32)
和PopCount(System.UInt64)
,两者都返回
System.Int32
,即 C# 中的int
。还有其他有用的操作:计算前导零或尾随零、计算整数以 2 为底的对数以及执行位旋转(也称为循环移位)。
在核心库中这样做的最大好处/原因可能是您可以获得硬件加速而无需链接到非托管代码,并且类文档证实了这一点:
This functionality is not in .NET Framework nor .NET Standard but it is in .NET Core 3.0 and newer, thus including .NET 5.0 and newer, under the
System.Numerics.BitOperations
static class, in particular the methodsPopCount(System.UInt32)
andPopCount(System.UInt64)
,both of which return
System.Int32
akaint
in C#.There are also other useful operations: count leading or trailing zeros, compute integer base-2 logarithm, and perform bit rotation aka circular shift.
Possibly the biggest benefit of/reason for doing this in the core libraries is that you can get hardware acceleration without linking to unmanaged code, and the class docs confirm this:
我知道这是一个非常古老的问题,但对于像我这样的人来说,至少有一个解决方法可能会有所帮助:
I know it's a very old question but it might be helpful for someone like me to have at least a workaround for this:
BitVector32
也不是BitArray
类也有这样的方法,所以我相信框架中确实缺少这个方法。就我个人而言,我认为这些类并不是真正有用,因为它们错过了许多自然的位操作。我不确定它们的真正用途是什么。事实上,它们的用处非常有限。
Neither the
BitVector32
nor theBitArray
classes have such a method either so I believe that this method is indeed missing from the framework.Personally, I think these classes aren’t really useful anyway since they miss many natural bit operations. I’m not sure what they are really intended for. As it is, their usefulness very limited.
这些方法基于 Hacker's Delight 的算法。您可以在此处下载它们的 C 代码。
These methods are based on algorithms from Hacker's Delight. You can download C code for them here.