在布尔数组中获取所有false元素索引的最快方法是什么?

Dav*_*est 3 .net c# arrays optimization boolean

假设我有一个布尔数组: {false, true, false, false, true, true, ...}

获取(例如)假元素的索引的最快方式(最优化)是什么?在这种情况下0 2 3

Ree*_*sey 13

for循环可能是执行此操作的最快方法:

List<int> indices = new List<int>();
for (int i=0;i < theArray.Length; ++i)
{
   if (theArray[i])
   {
       indices.Add(i);
   }
}
Run Code Online (Sandbox Code Playgroud)

请注意,通过预先分配以下内容,您可能会以额外内存为代价获得一点点速度List<int>:

List<int> indices = new List<int>(theArray.Length);
Run Code Online (Sandbox Code Playgroud)

这将避免额外的内存分配.


Ren*_*nan 5

最多32个元素:

int mask = 0;
for (int i = 0; i < arr.Length; i++)
{
    if (!arr[i]) mask += 1 << i;
}
Run Code Online (Sandbox Code Playgroud)

掩码将是一个32位掩码,如果该位索引处的元素为假,则每个位为1;如果该元素为真,则为0.它是数组的另一种表示,如果您希望这样说,则使用四个字节而不是每个布尔值一个字节.对于最多64个元素,您可以使用该long类型.但是,据我记忆,int你可以把它enum变成一个适当的位掩码.

涉及的总字节数:掩码四个,数组中每个元素一个,循环中的索引四个.完成的总分配:两个(如果我们不计算数组的分配).

  • 我不完全确定使用浮点功率运算会比使用整数运算更快... (3认同)
  • 2**n是一个快速操作......但正确的写入方式是`(1 << n)`,而不是`Math.Pow(2,n)`. (2认同)