其他分享
首页 > 其他分享> > c-在位数组中找到第一个零

c-在位数组中找到第一个零

作者:互联网

我有位图

uint64_t bitmap[10000] 

跟踪系统中分配的资源.
现在的问题是,如何有效地找到此位图中的第一个未设置(零)位?

我知道glibc中有ffsll(unsigned long long)用于查找第一个设置位,我假设它使用硬件指令来完成.

要在我的情况下使用此功能,首先我需要初始化数组以将每个位设置为1,然后在进行资源分配时,我必须在数组中线性搜索第一个非零字.然后使用ffsll()查找第一个设置位.

我怎样才能更快地完成?

更新:
我使用的是x86-64 CPU.

解决方法:

您可以维护一个位图树以有效地找到最低位集.在64位CPU上,您仅需具有3的树深即可跟踪4096个64位元素-这意味着仅使用三个ffsll调用.

基本上,这是通过将数组划分为64个字的块并为每个块分配一个64位索引来实现的.如果相应的位集字已设置所有位,则设置索引字的一位.当您更改位集中的某个位时,您将调整相应的索引字.

然后,您可以在顶部构建另一个索引数组以形成树.

每次更改位都需要一点额外的工作,但是与不需要线性搜索位集而需要的空闲位相比,节省的总开销(和存储空间)可以忽略不计.

标签:bit-manipulation,bitmap,c-3,linux
来源: https://codeday.me/bug/20191031/1974407.html