设置的最低有效位的位置

2023-12-05

我正在寻找一种有效的方法来确定整数中设置的最低有效位的位置,例如对于 0x0FF0 则为 4。

一个简单的实现是这样的:

unsigned GetLowestBitPos(unsigned value)
{
   assert(value != 0); // handled separately

   unsigned pos = 0;
   while (!(value & 1))
   {
      value >>= 1;
      ++pos;
   }
   return pos;
}

有什么想法如何从中挤出一些周期吗?

(注意:这个问题是针对喜欢这些事情的人,而不是针对告诉我 xyz 优化是邪恶的人。)

[edit]谢谢大家的想法!我还学到了一些其他的东西。凉爽的!


位摆弄黑客提供了一系列出色的,呃,有点花哨的技巧,并附有性能/优化讨论。对于您的问题,我最喜欢的解决方案(来自该站点)是“乘法和查找”:

unsigned int v;  // find the number of trailing zeros in 32-bit v 
int r;           // result goes here
static const int MultiplyDeBruijnBitPosition[32] = 
{
  0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8, 
  31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9
};
r = MultiplyDeBruijnBitPosition[((uint32_t)((v & -v) * 0x077CB531U)) >> 27];

有用的参考资料:

  • "使用 de Bruijn 序列对计算机单词中的 1 进行索引" - 解释上述代码为何有效。
  • "板表示 > 位板 > BitScan》 - 详细分析这个问题,特别关注国际象棋编程
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设置的最低有效位的位置 的相关文章

随机推荐

  • Android:检查活动是否被系统从服务中销毁

    我有一项服务监听来自服务器的一些事件 服务有 START STICKY 标志 当它被操作系统杀死时 该标志使他重新启动 当服务收到事件时 我有两种情况 首先 如果活动没有被终止 我需要将结果发送到本地广播接收器并更新 UI 其次 如果它被操
  • 添加表单操作[关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 当我提交时我试图再次转到index php page servers 但是当我提交表单时重定向是index php 但实际上是index php page servers 我该如何解决
  • Chrome 扩展:检测 Google 文档中的按键

    嘿 我和我的朋友们刚接触 javascript 并且遇到了一些代码问题 目前 我们正在尝试制作一个 Chrome 扩展 通过检测击键来检测用户何时以及对特定 google 文档进行了多少操作 我们当前的方法涉及创建一个 按键 事件监听器 我
  • Codeigniter SMTP 无法连接

    我正在使用 Codeigniter 3 并且我的网站上有一个简单的联系表 此联系表单在我的本地主机 XAMPP 环境中完美运行 但在我的共享 Web 托管 BT 上却不起作用 我无法弄清楚问题是什么 我一直在与他们的支持人员联系 显然 如果
  • site_url() 在 codeigniter 框架中无法正常工作

    以下代码对于 Codeigniter 框架无法正常工作 这是我的观点 a href gt Back to Main a 您应该在控制器构造方法或像这样调用视图的函数中加载 url helper this gt load gt helper
  • 在 AngularJS 中的页面之间共享数据返回空

    通常 我编写 SPA 并且通过服务在控制器之间共享数据很简单 我没有使用 SPA 格式 没有使用 ng view 并尝试在页面之间共享数据 但在加载第二个页面 以获取数据 时它是空的 第 1 页 索引 html div div
  • fastapi (starlette) RedirectResponse 重定向到 post 而不是 get 方法

    返回 RedirectResponse 对象后 我遇到了奇怪的重定向行为 事件 py router APIRouter router post create response model EventBase async def event
  • Android 更改小部件背景图片

    在过去的两天里 我一直在努力改变我的小部件的背景 基于一些 if 语句 现在删除 只是想从类中更改小部件背景 下面是我的源代码 不过 怎么了 我之前已经更改了图像 例如背景 但无法让它适用于我的小部件 谢谢 顺便说一句 这是我最近的尝试 W
  • 如何根据产品类别在 WooCommerce 添加到购物车按钮下方添加文本

    我尝试在某些类别的产品页面上的 WooCommerce 添加到购物车按钮下方添加一个 div 我在这里有点不知所措 这段代码没有破坏任何东西 但文本没有显示 我试过了 woocommerce div product form cart af
  • (flask)-sqlalchemy查询,必须导入所有模型

    我对 Flask 和 Flask SQLAlchemy 有一个问题 对于任何查询 我都需要导入所有相关模型 现在我的 auth views py 看起来像这样 编程的前几行所以只是一个测试视图 from flask import jsoni
  • 如何使用 jQuery 动态添加组合框

    我有这个正在创建的工作代码one组合框 你可以在这里看到它的工作原理 jsfiddle body on change combo function var selectedValue this val if this find option
  • 使用 django-allauth 注册后阻止用户登录

    我正在为我的 django 应用程序使用 django allauth 默认情况下 当用户成功注册时 他们会自动登录 如何覆盖默认行为并阻止用户在成功注册后登录 用户注册后 必须将他 她重定向到登录页面 我已禁用电子邮件验证 谢谢 sett
  • 合并大量 data.frames [重复]

    这个问题在这里已经有答案了 可能的重复 同时合并列表中的多个数据框 example data frames df1 data frame id c 1 73 2 10 43 v1 c 1 2 3 4 5 br df2 data frame
  • 检查 kubectl 版本时出现“身份验证为:您所在的匿名组”错误

    我正在尝试在我的计算机中设置 kubectl 工具来远程管理 Kubernetes 集群并使用 Helm 我正在 Ubuntu 16 04 机器上尝试 我通过以下链接关注官方 Kubernetes 文档 https kubernetes i
  • 将日历设置为下周四

    我正在 Android 中开发一个应用程序 该应用程序的服务必须在每周四和周日 22 00 执行 我真正需要的是将日历设置为该日期和时间 但是 我不确定该怎么做 Calendar calendar Calendar getInstance
  • 从 Azure 云表删除时出错 - ResourceNotFound

    我在从天蓝色表中删除对象时遇到间歇性问题 它只影响我大约 1 的尝试 如果稍后再次进行相同的调用 那么它工作正常 但我很想找出背后的原因 我在谷歌上搜索了一下 发现缺乏关于如何创建非常可靠的删除 插入和更新代码的文档 这令人非常惊讶 这一切
  • 飞镖双分精度

    执行此操作的正确方法是什么 399 9 100 我期望看到的是 3 999 但结果是 3 9989999999999997 你看到的结果是correct 这不是你想要的 双精度数不是精确值 写 399 9 得到的双倍实际上是精确值 399
  • 在 Android 上从 .png 文件绘制自定义视图的背景

    我通过扩展 View 创建了一个自定义 View 在 onDraw 中 我设法画了一些圆圈和其他东西 但现在我想从资源 SD 卡或流 添加背景 这实际上是我从服务器下载的地图 然后在其上绘制 适用于 Android 8 Override p
  • 当重复使用基本页面时,是否有一种方法可以加快 PDF 页面合并速度(基本上是在一个页面与另一个页面添加水印)?

    澄清 我不想向 PDF 文件添加页面 我想将内容添加到一个非常大的 PDF 页面 页面有时会发生变化 每次内容都不同 我正在使用 pypdf2 和 reportlab 对大 PDF 页面 10MB 进行少量添加 这需要 30 秒或更长时间
  • 设置的最低有效位的位置

    我正在寻找一种有效的方法来确定整数中设置的最低有效位的位置 例如对于 0x0FF0 则为 4 一个简单的实现是这样的 unsigned GetLowestBitPos unsigned value assert value 0 handle