在不使用查找表的情况下,UInt32
中计数设置位数(即计算1的数量)的最快方法是什么?有没有办法计算O(1)
?
答案 0 :(得分:11)
是否重复: how-to-implement-bitcount-using-only-bitwise-operators 要么 best-algorithm-to-count-the-number-of-set-bits-in-a-32-bit-integer
这个问题有很多解决方案。我使用的是:
int NumberOfSetBits(int i)
{
i = i - ((i >> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
return (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
}
答案 1 :(得分:9)
bit-twiddling hacks页面有许多选项。
当然,您可以争辩说,迭代所有32个可能的位是O(N),因为每次都是相同的成本:)
为简单起见,我会考虑每字节查找表的方法,或者Brian Kernighan的巧妙构思,它的迭代次数与有位集的次数相同,我将其写为:
public static int CountBits(uint value)
{
int count = 0;
while (value != 0)
{
count++;
value &= value - 1;
}
return count;
}
如果您不喜欢填充256条目查找表的想法,那么每个查询的查找仍然会非常快。请注意,8个数组查找可能比32个简单位操作慢。
当然,在采用特别深奥的方法之前,值得测试你应用的真实表现......这真的是你的瓶颈吗?
答案 2 :(得分:5)
.NET Core 3.0 https://bl.ocks.org/mbostock/9764126中已公开,允许您在uint或uint64上执行单指令填充计数。
int setBits = System.Runtime.Intrinsics.X86.Popcnt.PopCount(value);
还有64位版本System.Runtime.Intrinsics.X86.Popcnt.X64.PopCount()
,当在64位CPU上运行时,可以在ulong
上使用。
答案 3 :(得分:0)
这是Java中获取给定数字的设置位的解决方案。
import React from '../../../../../../../Library/Caches/typescript/2.9/node_modules/@types/react';