繁体   English   中英

在 uint32_t 数组中查找 0 位的最有效方法

[英]Most efficient way to find the bit with 0 in an array of uint32_t

我有一个uint32_t类型的数组,说大小为 1024。

int32_t *handle_generator= calloc(1024, sizeof(uint32_t));

我将使用这个数组handle_generator为特定类型的元素生成句柄 - myType_t 当创建myType_t的元素时,我必须从数组handle_generator中找到第一位为零并返回该索引值。 我将使用这个值作为我新创建的元素的句柄。

创建的myType_t类型的元素也可以被销毁。 在这种情况下,该被破坏元素的句柄值变得空闲并且可以重用。 所以数组handle_generator中的索引(匹配那个句柄值)应该设置为0。

在多次创建和删除元素myType_t后,数组handle_generator中会出现一系列 0 和 1 位。 在这种情况下,找到值为 0 的第一位的有效方法是什么?

最简单的方法是通过检查每个位来循环遍历数组handle_generator ,其时间复杂度为0(n); 其中 n 是位数。


例如,经过多次增删,如果handle_generator数组中的位如下

 0th                       13th
 |                         |
 v                         v
+-------------------------------------------------------------------------+
|1|1|1|1|1|1|1|1|1|1|1|1|1|0|1|1|1|1|1|1|1|1|1|1|1|0|1|1|1|1|1|1|...|0|0|0|
+-------------------------------------------------------------------------+

如果我们必须找到数组中的第一位 - handle_generator ,其值为 0,那么它位于索引 13 处。那么解决这个问题的最有效算法是什么?

您有 1024 个字来制作 32768 位的位掩码。

除此之外,我将使用 32 个字来制作位掩码,指示这 1024 个字中哪些是满的或未满的,然后用一个字来制作这 32 个字中哪些是满的位掩码。

这只是额外的 33 个单词,但是这样你可以很快找到第一个 0 -- 使用顶级掩码找到第一个非完整的中级掩码,使用中级掩码找到第一个非-完整的单词,然后找到该单词中的第一个 0。

当然,快速执行此操作需要快速找到在一个字中设置或清除的最低有效位的索引。 这是一个常见的话题: 设置的最低有效位的位置

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM