我一直在寻找Lucene.NET的分面搜索,我在这里找到了一个很好的例子,它解释了一个相当大的数量,除了它完全忽略了检查位数组中项目基数的功能.
任何人都可以告诉我它正在做什么吗?我不理解的主要问题是为什么bitsSetArray按原样创建,它用于什么以及所有if语句如何在for循环中工作.
这可能是一个很大的问题,但我必须先了解它是如何工作的,甚至可以考虑在我自己的代码中使用它.
谢谢
public static int GetCardinality(BitArray bitArray)
{
var _bitsSetArray256 = new byte[] {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, …Run Code Online (Sandbox Code Playgroud) 如何在UInt32不使用查找表的情况下计算设置位数(即计算1的数量)的最快方法是什么?有没有办法计算O(1)?
我有一个32位数字,想知道有多少位是1.
我在考虑这个伪代码:
mov eax, [number]
while(eax != 0)
{
div eax, 2
if(edx == 1)
{
ecx++;
}
shr eax, 1
}
Run Code Online (Sandbox Code Playgroud)
有更有效的方法吗?
我在x86处理器上使用NASM.
(我刚开始使用汇编程序,所以请不要告诉我使用extern库中的代码,因为我甚至不知道如何包含它们;))
(我刚刚发现如何计算32位整数中的设置位数?这也包含我的解决方案.还有其他解决方案,但不幸的是我似乎无法弄清楚,我将如何在汇编程序中编写它们)
可能的重复:
计算整数中的设置位数
最佳算法来计算32位整数中的设置位数?
这是一个考试问题,这就是我所有的 - "计算"在一个字节中"的数量""开"意味着1,我假设.我是否需要创建一个BitArray,随机填充它然后迭代它或者有不同的方式吗?