查找位数组中的第一个零

2024-01-12

我有一个位图

uint64_t bitmap[10000] 

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

我知道有ffsll(unsigned long long)在 glibc 中查找第一个设置位,我认为这是使用硬件指令来完成的。

要在我的例子中使用这个函数,首先我需要初始化数组以将每个位设置为 1,然后当我进行资源分配时,我必须线性搜索数组中的第一个非零字。然后使用 ffsll() 查找第一个设置位。

我怎样才能做得更快?

更新: 我使用的是 x86-64 cpu。


您可以维护一个tree位图以有效地找到最低位集。在 64 位 CPU 上,只需将树深度设置为 3 即可跟踪 4096 个 64 位元素——这意味着仅使用三个ffsll calls.

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

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

它需要对每个位进行一些额外的工作,但是与当您需要空闲位时不必线性搜索位集所节省的费用相比,额外工作(和存储)的总量可以忽略不计。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

查找位数组中的第一个零 的相关文章

  • C++:重写已弃用的虚拟方法时出现弃用警告

    我有一个纯虚拟类 它有一个纯虚拟方法 应该是const 但不幸的是不是 该接口位于库中 并且该类由单独项目中的其他几个类继承 我正在尝试使用这个方法const不会破坏兼容性 至少在一段时间内 但我找不到在非常量方法重载时产生警告的方法 以下
  • 如何使用recv()检测客户端是否仍然连接(并且没有挂起)?

    我写了一个多客户端服务器程序C on SuSE Linux 企业服务器 12 3 x86 64 我为每个客户端使用一个线程来接收数据 我的问题是 我使用一个终端来运行服务器 并使用其他几个终端来运行服务器telnet到我的服务器 作为客户端
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • 暂停下载线程

    我正在用 C 编写一个非常简单的批量下载程序 该程序读取要下载的 URL 的 txt 文件 我已经设置了一个全局线程和委托来更新 GUI 按下 开始 按钮即可创建并启动该线程 我想要做的是有一个 暂停 按钮 使我能够暂停下载 直到点击 恢复
  • 访问者和模板化虚拟方法

    在一个典型的实现中Visitor模式 该类必须考虑基类的所有变体 后代 在许多情况下 访问者中的相同方法内容应用于不同的方法 在这种情况下 模板化的虚拟方法是理想的选择 但目前这是不允许的 那么 模板化方法可以用来解析父类的虚方法吗 鉴于
  • IronPython:没有名为 json 的模块

    我安装了 IronPython 我的 python 文件如下所示 import sys print sys version import json 运行它的代码 var p Python CreateEngine var scope p C
  • 如何从网站下载 .EXE 文件?

    我正在编写一个应用程序 需要从网站下载 exe 文件 我正在使用 Visual Studio Express 2008 我正在使用以下代码 private void button1 Click object sender EventArgs
  • 将数据打印到文件

    我已经超载了 lt lt 运算符 使其写入文件并写入控制台 我已经为同一个函数创建了 8 个线程 并且我想输出 hello hi 如果我在无限循环中运行这个线程例程 文件中的o p是 hello hi hello hi hello hi e
  • Linux 上有关 getBounds() 和 setBounds() 的 bug_id=4806603 的解决方法?

    在 Linux 平台上 Frame getBounds 和 Frame setBounds 的工作方式不一致 这在 2003 年就已经有报道了 请参见此处 http bugs java com bugdatabase view bug do
  • Azure 事件中心 - 按顺序接收事件

    我使用下面的代码从 Azure Event Hub 接收事件 https learn microsoft com en us azure event hubs event hubs dotnet framework getstarted s
  • 生产代码中的 LRU 实现

    我有一些 C 代码 需要使用 LRU 技术实现缓存替换 目前我知道两种实现LRU缓存替换的方法 每次访问缓存数据时使用时间戳 最后比较替换时的时间戳 使用缓存项的堆栈 如果最近访问过它们 则将它们移动到顶部 因此最后底部将包含 LRU 候选
  • 有没有一种简单的方法可以让 Visual Studio 2015 使用特定的 ToolsVersion?

    使用特定版本构建项目或解决方案时msbuild我可以使用以下命令选择早期的 net 工具链 toolsversion or tv switch C Program Files x86 MSBuild 14 0 bin msbuild tv
  • 在类的所有方法之前运行一个方法

    在 C 3 或 4 中可以做到这一点吗 也许有一些反思 class Magic RunBeforeAll public void BaseMethod runs BaseMethod before being executed public
  • 是否可以有一个 out ParameterExpression?

    我想定义一个 Lambda 表达式out范围 有可能做到吗 下面是我尝试过的 C Net 4 0 控制台应用程序的代码片段 正如您在 procedure25 中看到的 我可以使用 lambda 表达式来定义具有输出参数的委托 但是 当我想使
  • 为什么拆箱枚举会产生奇怪的结果?

    考虑以下 Object box 5 int int int box int 5 int nullableInt box as int nullableInt 5 StringComparison enum StringComparison
  • 结构体指针的动态数组

    我必须使用以下代码块来完成学校作业 严格不进行任何修改 typedef struct char firstName char lastName int id float mark pStudentRecord pStudentRecord
  • 转到定义:“无法导航到插入符号下的符号。”

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我今天突然开始在我的项目中遇到一个问题 单击 转到定义 会出现一个奇怪的错误 无法导航到
  • WinRT 定时注销

    我正在开发一个 WinRT 应用程序 要求之一是应用程序应具有 定时注销 功能 这意味着在任何屏幕上 如果应用程序空闲了 10 分钟 应用程序应该注销并导航回主屏幕 显然 执行此操作的强力方法是在每个页面的每个网格上连接指针按下事件 并在触
  • 使用 Crypto++ 获取 ECDSA 签名

    我必须使用 Crypto 在变量中获取 ECDSA 签名 我在启动 SignMessage 后尝试获取它 但签名为空 我怎样才能得到它 你看过 Crypto wiki 吗 上面有很多东西椭圆曲线数字签名算法 http www cryptop
  • 错误:无效使用不完整类型“类 Move”/未定义对 Move::NONE 的引用

    拜托 我不知道为什么这个简单的代码被拒绝 它给了我 2 个编译错误 请帮帮我 I use 代码 块 20 03 我的编译器是GNU GCC 移动 hpp class Move public Move Move int int public

随机推荐

  • Webpack 迁移 3 -> 4:错误:找不到模块“webpack/lib/optimize/CommonsChunkPlugin”

    我正在尝试从 webpack 3 迁移到 webpack 4 当我尝试运行 webpack 时 我遇到的问题是 CommonsChunkPlugin npm run webpack dev server config config webp
  • Maven Wagon 插件可以使用 scp 私钥吗?

    Maven Wagon 插件可以配置为使用 ssh scp 私钥吗 我尝试过的所有操作仍然让 maven 在进行 scp 时询问我密码 您应该能够在中指定私钥的路径server http maven apache org settings
  • 如何在C# Windows窗体中选择TreeView中的子节点

    我的窗口窗体中有一个树视图 我使用以下函数来选择该树视图中的节点 private void FindAndSelect TreeNodeCollection collection object toSelect problem in thi
  • 如何删除桥接头而不出现错误?

    前几天 我在我的应用程序中添加了一个桥头文件 因为我试图将 Objective C 文件添加到我的 Swift 项目中 我在连接工作时遇到了困难 而且我也不知道如何实现 Objective C 文件 所以我决定重新开始 我删除了 Objec
  • 我应该如何编写一个在 Mathematica 中的 Apply 中使用的函数?

    我想知道如何编写一个在ApplyMathematica 中的函数 例如 我想简单地重新实现Or函数 我发现了以下内容 Apply 1 2 a b c 不行 因为它只是Or ed 列表中的前两个元素 非常感谢 无论有多少变量 这都会起作用 并
  • 循环遍历数据框和变量名称

    我正在寻找一种使用 FOR 循环来自动化 R 中的一些图表的方法 dflist lt c dataframe1 dataframe2 dataframe3 dataframe4 for i in dflist plot i var1 i v
  • 什么是代码洞,代码洞有合法用途吗?

    我第一次遇到这个词是在 StackOverflow 的问题 C 理论 将 JMP 写入 asm 中的 codecave https stackoverflow com questions 787006 我看到根据维基词典 http en w
  • WPF 画布上的完美中心

    由于画布需要顶部 左侧来放置 如果您想要将某些内容居中 在正确的 Canvas Top 处添加一个带有 Horizo ntalAlignment Center 的网格是最好的方法 还是有更好的方法 这个截图是一个 150X300 的画布 一
  • git update-index --assume-unchanged 文件的 git pull 错误

    我在做时遇到问题git pull origin master 我有一些具有本地配置设置且与原始版本不同的文件 我已将它们标记为未通过代码跟踪 gt git update index assume unchanged html index p
  • 自引用实体和插入顺序 - 使用 Entity Framework Code First

    我有两个如下所示的实体 public class AssetSession Key public Guid Id get set public string RoomNumber get set public Contact Contact
  • 由于进程无法加载 jdwp 代理,因此未启动调试器。反应本机

    我在最初从节点服务器加载服务器时遇到问题 第一次出现白屏 但当我第二次跑步时 这是正常的 要解决这个问题 您需要 为android定制你的tcp服务器 对于iOS你不需要定制 adb reverse tcp 8081 tcp 8081 确保
  • 如何自定义InitializeComponent的代码生成?更具体地说,如何对所有生成的代码进行后处理?

    我正在尝试自定义 Windows 窗体设计器的代码生成InitializeComponent MSDN 文章 在 NET Framework 可视化设计器中自定义代码生成 http msdn microsoft com en us libr
  • 如何在高图表中包装图例项目?

    我在使用 highcharts 时遇到了一个大问题 因为我已经尝试了几个小时来包装图例项目 如果它们很长 我尝试设置图例和图例项宽度 但我的文本仍然从图例中出来 我唯一发现的就是改变highcharts src js但我认为这不是解决这个问
  • Apex 代码版本控制

    有没有办法集成 Apex 和 Visualforce 代码的版本控制系统 我可以考虑保留一个单独的存储库 但无法将其与 Salesforce Platform 集成 提前致谢 您可以通过使用 Subversion 和 Force com E
  • 如何判断一个点是否在圆内?

    如何测试 LatLng 点是否在圆的范围内 谷歌地图 JavaScript v3 getBounds 方法返回圆的边界框 圆是一个矩形 因此如果一个点落在圆之外但在边界框内 您将得到错误的答案 Use the 球面几何库 https dev
  • 如何访问列表中的随机项?

    我有一个 ArrayList 我需要能够单击一个按钮 然后从该列表中随机挑选一个字符串并将其显示在消息框中 我该怎么做呢 创建一个实例Random某处上课 请注意 不要在每次需要随机数时都创建一个新实例 这一点非常重要 您应该重用旧实例以实
  • spring boot OAuth2 基于角色的授权

    我们有一个扩展 AuthorizationServerConfigurerAdapter 的专用授权服务器 我们在其中设置了覆盖 void configure ClientDetailsS erviceConfigurerclients 方
  • Goertzel算法获取相位?

    我正在使用 Goertzel 算法来获取特定频率的幅度 我现在正在尝试从中获取相位 但我不知道如何 有人可以解释一下 并向我展示如何从这段代码中获取某个 f 的相位吗 另外 我使用它的频率为 16khz 采样率为 44 1 我可以运行的最小
  • 有没有办法在不调用 System.exit() 的情况下终止使用 java3d 的 java 应用程序?

    Java3D 启动多个系统线程 并且不会在它们上设置 isDaemon 标志 当我处置应用程序的 唯一 JFrame 时 它 不会终止 因为这些线程仍在运行 调用 System exit 似乎是终止应用程序的唯一方法 当然 或者从外部杀死它
  • 查找位数组中的第一个零

    我有一个位图 uint64 t bitmap 10000 跟踪系统中分配的资源 现在的问题是如何有效地找到该位图中的第一个未设置 零 位 我知道有ffsll unsigned long long 在 glibc 中查找第一个设置位 我认为这