求出小于某个数的 2 次方最快的方法是什么?

2024-01-03

我正在使用这个逻辑:

while ((chase<<(++n))< num) ;

where chase=1,n=0最初和num是我想要找到略小于它的 2 次幂的值。

循环之后我只需应用

chase=1; 
chase<<(n-1);

尽管我得到了正确的答案,但我只是想找到最快的方法。有没有更快的方法?


对于正整数v2的幂小于或等于 to v is 2^[log2(v)] (i.e. 1 << [log2(v)]), 在哪里[] in [log2(v)]代表四舍五入down。 (如果您需要 2 的幂,即less than v,您可以轻松调整算法。)

对于非零v, [log2(v)]是二进制表示中最高 1 位的索引v.

您必须已经了解上述所有内容,因为这正是您在原始代码中所做的事情。然而,它可以更有效地完成。 (当然,分析并查看新的“更高效”解决方案是否实际上对您的数据更有效始终是一个好主意。)

用于查找最高 1 位索引的通用平台无关技巧基于 DeBruijn 序列。这是 32 位整数的实现

unsigned ulog2(uint32_t v)
{ /* Evaluates [log2 v] */
  static const unsigned MUL_DE_BRUIJN_BIT[] = 
  {
     0,  9,  1, 10, 13, 21,  2, 29, 11, 14, 16, 18, 22, 25,  3, 30,
     8, 12, 20, 28, 15, 17, 24,  7, 19, 27, 23,  6, 26,  5,  4, 31
  };

  v |= v >> 1;
  v |= v >> 2;
  v |= v >> 4;
  v |= v >> 8;
  v |= v >> 16;

  return MUL_DE_BRUIJN_BIT[(v * 0x07C4ACDDu) >> 27];
}

还有其他位算法解决方案,可以在这里找到:https://graphics.stanford.edu/~seander/bithacks.html https://graphics.stanford.edu/~seander/bithacks.html

但是,如果您需要最大效率,请注意许多现代硬件平台本身支持此操作,并且编译器提供用于访问相应硬件功能的内在函数。例如,在 MSVC 中,它可能如下所示

unsigned ulog2(uint32_t v)
{ /* Evaluates [log2 v] */
  unsigned long i;
  _BitScanReverse(&i, v);
  return (unsigned) i;
}

而在 GCC 中,它可能如下所示

unsigned ulog2(uint32_t v)
{ /* Evaluates [log2 v] */
  return 31 - __builtin_clz(v);
}

如果您需要 64 位版本的函数,您可以以相同的方式重写它们。或者,由于对数的良好特性,您可以通过将 64 位值分成两个 32 位一半并将 32 位函数应用于最高阶非零一半来轻松构建它们。

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

求出小于某个数的 2 次方最快的方法是什么? 的相关文章

随机推荐

  • Debianizing Python 程序以获得 .deb [重复]

    这个问题在这里已经有答案了 Aim 创建一个可安装的 deb文件 或包 单击该按钮将在 Linux 计算机上安装该软件 并且图标将放置在 GNOME 面板上 以便从那里启动该应用程序 我所提到的 我参考了两个 debianizing 指南
  • 使用“mvn test”进行参数化 JUnit 测试是否正确?

    我刚刚使用 JUnit 测试用例实现了JUnit4 11 下面的例子 https github com junit team junit blob master doc ReleaseNotes4 11 md example 1 https
  • WebView显示黑屏

    我有点不好意思发这个帖子 但我似乎不明白 我哪里出错了 我已经看过每一个例子和每一个 教程和一切对我来说都很合适 这就是我正在做的事情 我 有一个列表视图 当您单击某个项目时 它将带您进入 显示一些与之关联的静态格式文本的 WebView
  • 等待 RxJs.Subscriptions 完成后再恢复

    在我的 Angular 2 应用程序中 我需要发出一系列 http 请求 我有两个服务 A 和 B 每个服务都发出请求 A get and B get 从 API 获取数据并将其存储在其服务中 这两个可以同时调用 但是我有第三个请求doSo
  • 用Python绘制盒子

    平台 WinXP SP2 python 2 5 4 3 活跃状态分布 有谁写成功了盒子绘图字符 http en wikipedia org wiki Box drawing characters在Python中 当我尝试运行这个时 prin
  • addEventListener('keydown',handlekeydown,false) 与 .onkeydown 的工作方式不同,用于替换键入的击键

    我正在使用 keydown 事件来替换在输入文本框中键入的特定字符 当我使用时 document getElementById inputText onkeydown handleInputTextKeydown 或 JQuery 等效项
  • 为什么在尝试拆分一行输入并分配给多个变量时会出现 ValueError?

    我尝试了一些像这样的代码来从文件中读取问题和答案对 questions list answers list with open qanda txt r as questions file for line in questions file
  • 我应该如何使用服务器端和客户端代码编写 Node.js Web 应用程序?

    我计划编写一个 spin backbone js 风格的 Web 应用程序 它基本上只是将一个大型 application js 文件传输到客户端的浏览器 该浏览器使用 ajax 与 node js 后端进行通信 问题是我不知道如何构建这样
  • 对于自定义错误,我应该使用什么 HTTP 状态代码?

    我需要返回有关错误的信息 例如 客户的联系人不能超过 3 个 作业字段为空 超出操作限制 我需要发送带有自己的状态代码的每个错误吗 我可以用吗400 BadRequest对于所有这些错误 我可以使用 400 BadRequest 来处理所有
  • Tensorflow 无法预测足够准确的结果

    我对我在 Tensorflow 项目中选择的算法有一些基本问题 我输入了大约 100 万组训练数据 但仍然无法获得足够准确的预测结果 我使用的代码基于旧的 Tensorflow 示例 https github com tensorflow
  • 学习 Delphi 最简单/最有效的方法是什么?

    我对编程完全陌生 我选择 Delphi 作为我想学习的编程语言 我基本上想构建使用套接字填写和提交 Web 表单的工具 并且我希望它们也是多线程的 我希望它们功能丰富并且性能正确 我并不急于这样做 因为我确实知道任何事情 尤其是编程 都需要
  • 持续集成工具

    我正在研究持续集成工具及其好处 对于我的研究 我正在研究以下工具 亚搏体育appGitLab持续集成 Jenkins Bamboo GoCD TeamCity 现在我不会打扰你所有的要求和好处 但到目前为止 除了这些之外 我还没有发现这些工
  • 如何在文本输入中插入很棒的字体图标? [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 如何将日历网络字体图标插入我的输入字段 HTML
  • SICP 第 3.1.1 节 - 程序中的本地状态似乎不一致

    我正在努力完成 SICP 我在第3 1 1节 http mitpress mit edu sicp full text book book Z H 20 html并查看当地状态 我正在 GNU Guile v2 0 11 中评估这些练习 我
  • IIS:如何获取元数据库路径?

    我正在尝试获取 IIS 服务器已知的 MIME 类型列表 你可以看到我在两年前问过并回答过这个问题 https stackoverflow com questions 174888 asp net iis6 how to search th
  • ASP.NET 会员密码过期

    我正在使用 ASP NET 成员资格来验证我的 Web 应用程序 这对我来说非常有用 我现在必须实现密码过期 如果密码已过期 用户应被重定向到ChangePassword屏幕 并且在不更改密码的情况下不应允许访问应用程序的任何其他部分 有很
  • 为什么 Visual Studio 2010“请求数据”?

    当我切换到 VS2010 中的 ASP NET 设计器时 我遇到了一个奇怪的问题 它不会每次都发生 但一旦发生 它每次都会持续 直到我重新启动 基本上 当我单击 设计 按钮 选项卡从 HTML 切换到设计器时 状态栏中会出现文本 请求数据
  • 将 IISExpress 绑定到 IP 地址失败

    我已经在 Win8 Win8 1 和 Win10 的同一个 Windows 机器上运行了此功能 昨天我执行了 Windows 10 的 Threshold 2 升级 现在我无法在 IISExpress 中启动我的 API 绑定设置如下
  • Emacs 全局设置键到 C-TAB

    我正在尝试在 Emacs 中设置 Ctrl TAB 的键绑定 我使用了以下调用 global set key read kbd macro C TAB my func 然而 每当我使用它时 我都会得到一个
  • 求出小于某个数的 2 次方最快的方法是什么?

    我正在使用这个逻辑 while chase lt lt n lt num where chase 1 n 0最初和num是我想要找到略小于它的 2 次幂的值 循环之后我只需应用 chase 1 chase lt lt n 1 尽管我得到了正