将特定位置的位收集为新值

2024-01-04

我有一个大小为 N 个字符的位掩码,它是静态已知的(即可以在编译时计算,但它不是单个常量,所以我不能只是写下来),位设置为 1 表示“想要”的位。我有一个相同大小的值,该值只有在运行时才知道。我想按顺序从该值收集“想要的”位到新值的开头。为了简单起见,我们假设所需的位数

完全未优化的参考代码希望具有正确的行为:

template<int N, const char mask[N]>
unsigned gather_bits(const char* val)
{
    unsigned result   = 0;
    char*    result_p = (char*)&result;
    int      pos      = 0;
    for (int i = 0; i < N * CHAR_BIT; i++)
    {
        if (mask[i/CHAR_BIT] & (1 << (i % CHAR_BIT)))
        {
            if (val[i/CHAR_BIT] & (1 << (i % CHAR_BIT)))
            {
                if (pos < sizeof(unsigned) * CHAR_BIT)
                {
                    result_p[pos/CHAR_BIT] |= 1 << (pos % CHAR_BIT);
                } 
                else
                {
                    abort();
                }
            }
            pos += 1;
        }
    }
    return result;
}

尽管我不确定该公式是否实际上允许在编译时访问掩码的内容。但无论如何,它是可用的,也许是constexpr功能或其他东西会是一个更好的主意。我在这里寻找的不是必要的 C++ 魔法(我会弄清楚的),只是算法。

为清楚起见,使用 16 位值和虚数二进制表示法的输入/输出示例:

mask   = 0b0011011100100110
val    = 0b0101000101110011
--
wanted = 0b__01_001__1__01_ // retain only those bits which are set in the mask
result = 0b0000000001001101 // bring them to the front
                   ^ gathered bits begin here

我的问题是:

  • 执行此操作最有效的方法是什么? (是否有任何硬件说明可以提供帮助?)

  • 如果掩码和值都被限制为怎么办?unsigned,那么一个单词,而不是一个无界的字符数组?那么可以通过固定的、简短的指令序列来完成吗?


这里将pext(并行位提取)这正是您在 Intel Haswell 中想要的。我不知道该指令的性能如何,但可能比其他指令更好。此操作也称为“compress-right”或简称“compress”,Hacker's Delight 的实现是这样的:

unsigned compress(unsigned x, unsigned m) {
   unsigned mk, mp, mv, t; 
   int i; 

   x = x & m;           // Clear irrelevant bits. 
   mk = ~m << 1;        // We will count 0's to right. 

   for (i = 0; i < 5; i++) {
      mp = mk ^ (mk << 1);             // Parallel prefix. 
      mp = mp ^ (mp << 2); 
      mp = mp ^ (mp << 4); 
      mp = mp ^ (mp << 8); 
      mp = mp ^ (mp << 16); 
      mv = mp & m;                     // Bits to move. 
      m = m ^ mv | (mv >> (1 << i));   // Compress m. 
      t = x & mv; 
      x = x ^ t | (t >> (1 << i));     // Compress x. 
      mk = mk & ~mp; 
   } 
   return x; 
} 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将特定位置的位收集为新值 的相关文章

  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • 按成员序列化

    我已经实现了template
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 重载<<的返回值

    include
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new

随机推荐

  • Android Studio 没有显示任何错误?

    我不知道发生了什么事但是当我复制粘贴代码或写一些东西时 没有显示错误 See the picture below in which i copied a code but no imports yet But Android studio
  • python:使用多处理共享巨大的字典

    我正在使用多重处理处理存储在字典中的大量数据 基本上我所做的就是加载一些存储在字典中的签名 从中构建一个共享的 dict 对象 获取 Manager dict 返回的 代理 对象 并将此代理作为参数传递给具有在多处理中执行 只是为了澄清 s
  • JAX-RS MessageBodyReader

    我正在从提供者那里了解 MessageBodyReader 方法的工作原理 我看到该方法返回一个对象 但我不确定如何从服务访问该对象 我可以获得有关如何从 reader 类返回对象的解释吗 这将帮助我为所有 DTO 应用读取规则 提前致谢
  • 头部与身体之间的间距

    我有一个简单的 html 表 如下所示 table thead tr th Column 1 th th Column 2 th tr thead tbody tr class odd first row td Value 1 td td
  • 如何在不使用 super() 的情况下访问父类的重写方法?

    如下所示 我尝试将子类的对象强制转换为其父类的对象 进展顺利 但是 当我尝试访问父类的重写方法时 它不会发生 相反 调用子类中的重写方法 我知道我可以使用 super 关键字来做到这一点 但我只是想知道为什么这不能通过强制转换来完成 这是父
  • IE10 中的 Angular UI Bootstrap 进度条

    我正在使用 Angular UI Bootstrap 来显示进度条 在 IE 中我的网站出现问题后 我用 IE 查看了Angular UI Bootstrap 网站 http angular ui github io bootstrap 并
  • 如何处理对话框中的后退按钮?

    我正在开发一个应用程序 当按下按钮时 它会打开一个带有 确定 和 取消 按钮的对话框 效果很好 当用户按下后退按钮时 我按如下方式处理 public boolean onKeyDown int keyCode KeyEvent event
  • 使用 AVPlayer 返回“非多路径连接”错误

    我正在使用 AVKit 播放 YouTube URL 我在按钮操作中有这段代码 IBAction func trailerButtonAction sender Any guard let youtubeUrl youtubeURL els
  • 具有访问权限的 Excel VBA 不会在此代码上关闭

    你好 我几分钟前刚刚发帖 有人回答了我关于 Excel 未关闭的问题 我正在使用访问权限打开工作表并添加表格 Excel 不会关闭 这会导致问题 因为当我在另一个函数中再次获取 Excel 对象时 我正在使用的工作表将无法打开 也不会对其进
  • Javascript 和 CSS 之间保持 DRY

    假设您有一个可以通过按钮切换打开和关闭的菜单 我的标准方法是为关闭的菜单编写 CSS 并编写指定 或动画 打开菜单状态的 Javascript 最近我开始接触 Active js 一个客户端 MVC 框架 它为视图类提供了用于制作 DOM
  • 将 JSON 解组为映射/字符串列表

    我想将 Json 解组到映射 字符串列表 例如 Map gt 这是我的输入 pointsOfSale pointOfSale href pointsOfSale UUID 0abc2aca 7930 4c9e 9f38 8af3d0692e
  • Spark Window函数最后一个非空值

    我们有一个用户事件的时间序列数据库 如下所示 timestamp user id event ticke type error type 2019 06 06 14 33 31 user a choose ticket ticke b NU
  • 在 MySQL 中存储 0.00001

    我有一个赚取网站 我希望用户每次点击赚取 0 00001 我知道它低于 1p 我可以使用什么类型的色谱柱 我努力了int and float但两者都不起作用 Use DECIMAL http dev mysql com doc refman
  • 将勾号 (✔) 添加到 string.xml

    我在字符串消息上添加勾号 strings xml 但是当我在移动设备上显示它时 我得到一个 框 而不是刻度线 我已直接将符号粘贴到我的字符串消息上 我们有什么办法可以处理吗 我们需要使用 unicode 值吗 添加unicode符号 u27
  • 如何使用 Perl 进行批量搜索和替换?

    我有以下脚本 它接受输入文件 输出文件和 将输入文件中的字符串替换为其他字符串并写出 输出文件 我想更改脚本以遍历文件目录 即 脚本不应提示输入和输出文件 而应采用 作为参数的目录路径 例如 C temp allFilesTobeRepla
  • Angular 8 通用服务器端渲染

    我正在关注这个教程https blog angular university io angular universal https blog angular university io angular universal 但我无法执行第一个
  • 微服务:工作者角色、API 或两者兼而有之?

    我见过微服务的混合示例 它们实现为工作角色处理队列中的请求和 或 API REST 支持异步场景 可以利用队列 通过简单的哑队列侦听器将请求转发到微服务 REST API 而同步场景将直接调用 REST API 我认为微服务这个术语的定义很
  • Vuejs 子组件中的 Prop 值无法绑定到元素属性

    我正在使用 Vuetify 在 Vuejs 中开发一个管理应用程序 并且表单中有三个字段供用户选择十六进制颜色值 为了让用户更容易 我实现了一个基于的颜色选择器这个代码笔 https codepen io Brownsugar pen Na
  • JQuery 通过 IFrame 进行可拖动和可调整大小(解决方案)

    我最近在使用 JQuery Draggable 和 Resizing 插件时遇到了一些麻烦 在寻找解决方案时 我在许多不同的地方发现了一些非常零碎的代码 最后归档到一个干净的解决方案 该解决方案似乎对我来说几乎完美 我想我会与其他人分享我的
  • 将特定位置的位收集为新值

    我有一个大小为 N 个字符的位掩码 它是静态已知的 即可以在编译时计算 但它不是单个常量 所以我不能只是写下来 位设置为 1 表示 想要 的位 我有一个相同大小的值 该值只有在运行时才知道 我想按顺序从该值收集 想要的 位到新值的开头 为了