Python 相当于 Bit Twiddling Hacks 中的 C 代码?

2024-05-10

我有一个位计数方法,我正在尝试尽可能快地实现。我想尝试下面的算法位摆弄黑客 http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel,但我不知道 C。什么是“类型 T”以及 (T)~(T)0/3 的 python 等价物是什么?

最好的概括 整数的计数方法 位宽高达 128(参数化为 T 型)是这样的:

v = v - ((v >> 1) & (T)~(T)0/3);      // temp 
v = (v & (T)~(T)0/15*3) + ((v >> 2) & (T)~(T)0/15*3);      // temp
v = (v + (v >> 4)) & (T)~(T)0/255*15;                      // temp
c = (T)(v * ((T)~(T)0/255)) >> (sizeof(v) - 1) * CHAR_BIT; // count

T 是整数类型,我假设它是无符号的。由于这是 C,因此它将是固定宽度,可能(但不一定)是 8、16、32、64 或 128 之一。片段(T)~(T)0在该代码示例中重复出现的仅给出值 2**N-1,其中 N 是类型 T 的宽度。我怀疑代码可能要求 N 是 8 的倍数 以便正确操作。

下面是给定代码到 Python 的直接翻译,以 N(T 的宽度(以位为单位))进行参数化。

def count_set_bits(v, N=128):
    mask = (1 << N) - 1

    v = v - ((v >> 1) & mask//3)
    v = (v & mask//15*3) + ((v >> 2) & mask//15*3)
    v = (v + (v >> 4)) & mask//255*15
    return (mask & v * (mask//255)) >> (N//8 - 1) * 8

Caveats:

(1) 以上仅适用于 2**128 以内的数字。不过,您也许可以将其推广到更大的数字。

(2)存在明显的低效率:例如,'mask//15'被计算了两次。当然,这对于 C 来说并不重要,因为编译器几乎肯定会在编译时而不是运行时进行除法,但 Python 的窥孔优化器可能没那么聪明。

(3) 最快的 C 方法很可能无法转化为最快的 Python 方法。为了提高 Python 速度,您可能应该寻找一种能够最大限度地减少 Python 按位运算数量的算法。正如亚历山大·盖斯勒所说:个人资料!

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

Python 相当于 Bit Twiddling Hacks 中的 C 代码? 的相关文章

随机推荐

  • 绘图(px)animation_frame错误,日期时间不被接受

    我想通过绘图制作类似于以下示例的动画条形图 https plotly com python animations https plotly com python animations 我有以下代码 fig px bar eu vaccine
  • 为什么迭代器类型推导失败? [复制]

    这个问题在这里已经有答案了 为什么这在 C 中不起作用 为什么我不能限制foo的参数为std vector
  • ASP.NET 如何在 Web API 中读取多部分表单数据?

    我将多部分表单数据发送到我的 Web API 如下所示 string example my string HttpContent stringContent new StringContent example HttpContent fil
  • Extbase查询比较同一个表中的两个字段

    是否可以在查询 API 中比较两个数据库字段 例如 我想比较字段 tstamp 和 crdate 如下所示 SELECT FROM tt content WHERE tstamp gt crdate 在查询 api 中我找不到解决方案 获取
  • Eclipse 中的字/行计数工具

    有没有任何工具或插件可以做到这一点 CodeBlock 有这个简洁的工具 非常好 不知道它是否可以在 Eclipse 上使用 谢谢 http metrics sourceforge net http metrics sourceforge
  • 使用点符号将数字传递到函数中

    如果我有一个对象和函数 var obj 1234 example sample 5678 example sample function example num str if obj num hasOwnProperty str manip
  • Slack 机器人发送图像

    我正在开发一个 slack 机器人 我正在实现一个通知功能 它将每隔一小时发送一次通知 目前 我在通知中发送普通文本 但我需要随文本一起发送图像 可以发送图片吗 您可以将图像作为消息附件的一部分发送 这可以是完整图像或缩略图 只需添加ima
  • 在 Windows 上将 Word2vec 与 Tensorflow 结合使用

    In 本教程文件 https github com tensorflow models blob master tutorials embedding word2vec py L45通过 Tensorflow 找到以下行 第 45 行 来加
  • 基于多线程的 RabbitMQ 消费者

    我们有一个 Windows 服务 它监听单个 RabbitMQ 队列并处理消息 我们希望扩展相同的 Windows 服务 以便它可以监听 RabbitMQ 的多个队列并处理消息 不确定使用多线程是否可以实现这一点 因为每个线程都必须侦听 阻
  • 仅适用于安全页面的安全回形针 URL

    我正在尝试找到使回形针网址安全的最佳方法 但仅限于安全页面 例如 显示存储在 S3 中的图像的主页是http mydomain com http mydomain com图像网址是http s3 amazonaws com mydomain
  • 无法在 Visual Studio 2022 中启动调试适配器

    如果我创建一个启用了 Docker 支持的 ASP Core MVC 目标框架 5 0 并启动它 我会得到 发生一个或多个错误 无法启动调试适配器 附加信息可能会 在输出窗口中可用 操作被取消 这是调试输出 启用 DebugAdapterH
  • Java G1 GC 处理引用对象运行缓慢

    我已经在 J ava 上运行了计数器 它24小时工作 每秒点击通过100次左右 白天 GC 处理时间从 20 60 毫秒缓慢上升到 10000 60000 毫秒 然后下降到 20 60 毫秒 这种模式不时地重复 从 GC 日志中我发现 GC
  • R 中的 huxtable 即使有选项也默认为科学记数法(scipen=999)

    我试图生成像样的桌子 并在过去的一周尝试了很多软件包 我的头在游泳 今天早上开始使用 package huxtable 并试图摆脱科学记数法 x lt mtcars 1 5 1 2 x mpg lt x mpg 10000000 get s
  • 在 Ubuntu 16.04 中创建虚拟主机

    我已经开始在 laravel 中工作并使用 lampp 我看过很多使用虚拟主机来制作用户友好的 url 的教程 我想在 Ubuntu 16 04 上执行此操作 以下教程对我不起作用 https ourcodeworld com articl
  • ptrace和waitpid有什么关系?

    我正在练习使用ptrace但我不太了解它和之间的关系waitpid 这是我的测试程序 int main int argc char argv pid t pid 22092 if ptrace PTRACE ATTACH pid NULL
  • 如何准备sql语句并绑定参数?

    不幸的是 文档 http www sqlite org完全缺乏示例 这真的很奇怪 就好像它假设所有读者都是优秀的程序员一样 然而 我对C 并且无法真正从文档中弄清楚如何真正准备和执行语句 我喜欢它的实施方式PDO for PHP 通常 我只
  • 有没有办法回显所有驱动器/分区的列表,例如 C:\ D:\ E:\ 等并提示用户选择其中一个来执行某些功能?

    我想知道是否有一种方法可以检查并回显 PC 上所有可用驱动器 分区的列表 并提示用户通过输入字母并按 Enter 提交来选择其中一个 然后批处理文件将继续 理想的结果可能是怎样的 echo off echo List all drives
  • Git - 包含来自其他存储库的文件

    对于 Git 我想包含一些常见的 JS CSS 库和 或实用方法 即来自另一个存储库的特定文件 在我的项目中 我希望它们始终是最新的 我真的不想要整个远程存储库 如果我可以处理远程文件的 本地副本 并将更改推送回来 那就太好了 一个有点类似
  • 使用登录名(用户)创建 PostgreSQL 9 角色只是为了执行函数

    我多年来一直在寻找这个 并且尝试了网络上的所有方法但没有成功 我可以在 MSSQL 中做到这一点 但我没有找到在 PostgreSQL 中做到这一点的方法 我想要实现的只是创建一个具有登录名的角色 该角色无法创建 删除或更改数据库 函数 表
  • Python 相当于 Bit Twiddling Hacks 中的 C 代码?

    我有一个位计数方法 我正在尝试尽可能快地实现 我想尝试下面的算法位摆弄黑客 http graphics stanford edu seander bithacks html CountBitsSetParallel 但我不知道 C 什么是