按位右展开算法

2024-02-27

本来这篇文章要求逆绵羊和山羊操作,但我意识到这超出了我的实际需要,所以我编辑了标题,因为我只需要一个右展开算法 http://programming.sirrida.de/bit_perm.html#c_e,这更简单。我在下面描述的示例仍然具有相关性。

原帖:

我正在尝试弄清楚如何进行反向绵羊和山羊操作,或者更好的是展开右翻转。

根据黑客的喜悦 http://hackersdelight.org/,绵羊和山羊操作可以表示为:

SAG(x, m) = compress_left(x, m) | compress(x, ~m)

根据这个网站 http://programming.sirrida.de/bit_perm.html#sag,逆矩阵可以通过以下方式找到:

INV_SAG(x, m, sw) = expand_left(x, ~m, sw) | expand_right(x, m, sw)

但是,我找不到 Expand_left 和 Expand_right 函数的任何代码。当然,它们是 compress 的反函数,但 compress 本身有点难以理解。

Example:

为了更好地解释我正在寻找的内容,请考虑一组 8 位,例如:

0000abcd

变量a、b、c和d可以是1或0。此外,还有一个可以重新定位位的掩码。例如,如果面具是01100101,结果位将被重新定位如下:

0ab00c0d

这可以通过逆绵羊和山羊操作来完成。然而,根据本节 http://programming.sirrida.de/bit_perm.html#c_e_flip对于上述站点,有一种更有效的方法,他称之为展开右翻转。看着他的网站,我无法弄清楚如何做到这一点。


这是expand_right来自黑客之乐,它只是说expand但这是right版本。

unsigned expand(unsigned x, unsigned m) {
    unsigned m0, mk, mp, mv, t;
    unsigned array[5];
    int i;
    m0 = m;        // Save original mask.
    mk = ~m << 1;  // We will count 0's to right.
    for (i = 0; i < 5; i++) {
        mp = mk ^ (mk << 1);             // Parallel suffix.
        mp = mp ^ (mp << 2);
        mp = mp ^ (mp << 4);
        mp = mp ^ (mp << 8);
        mp = mp ^ (mp << 16);
        mv = mp & m;                     // Bits to move.
        array[i] = mv;
        m = (m ^ mv) | (mv >> (1 << i)); // Compress m.
        mk = mk & ~mp;
    }
    for (i = 4; i >= 0; i--) {
        mv = array[i];
        t = x << (1 << i);
        x = (x & ~mv) | (t & mv);
    }
    return x & m0;     // Clear out extraneous bits.
}

您可以使用expand_left(x, m) == expand_right(x >> (32 - popcnt(m)), m)使left版本,但这可能不是最好的方法。

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

按位右展开算法 的相关文章

  • 确定解决迷宫问题的最小线段数

    我有一个问题 我需要定义一个具有最少数量的顶点的多边形 该多边形与不透明的图像中的每个像素相交或包含每个像素 令 N 为图像中的像素数 我唯一的假设是图像的边界 孔 内不能包含透明像素 并且至少有两个像素是不透明的 举个例子 假设我有以下图
  • 如何确定算法函数的复杂度?

    您如何知道算法函数对于特定操作是否需要线性 常数 对数时间 它取决于CPU周期吗 您可以通过三种方式 至少 做到这一点 在网上查找算法 看看它是如何描述其时间复杂度的 根据输入大小 自己检查算法 查看嵌套循环和递归条件等内容 以及每个循环运
  • 最慢的计算复杂度(Big-O)

    在这些算法中 我知道 Alg1 是最快的 因为它是 n 平方的 接下来是 Alg4 因为它是 n 的立方 然后 Alg2 可能是最慢的 因为它是 2 n 这应该具有非常差的性能 然而Alg3和Alg5在我的阅读速度方面还没有遇到过 这两种算
  • 如何求小于给定数的最大2次方

    我需要找到小于给定数字的最大 2 次幂 我陷入困境 找不到任何解决方案 Code public class MathPow public int largestPowerOf2 int n int res 2 while res lt n
  • 无需构建树即可预测霍夫曼压缩比

    我有一个二进制文件 我知道其中每个符号出现的次数 如果我要使用霍夫曼算法压缩它 我需要预测压缩文件的长度 我只对假设的输出长度感兴趣 而不对单个符号的代码感兴趣 因此构建霍夫曼树似乎是多余的 作为一个例子 我需要得到类似的东西 包含 4 个
  • 从三点求圆心的算法是什么?

    我在圆的圆周上有三个点 pt A A x A y pt B B x B y pt C C x C y 如何计算圆心 在Processing Java 中实现它 我找到了答案并实施了一个可行的解决方案 pt circleCenter pt A
  • 分而治之策略来确定列表中是否有超过 1/3 的相同元素

    我正在使用分治算法来确定列表中是否有超过 1 3 的元素相同 例如 1 2 3 4 不 所有元素都是唯一的 1 1 2 4 5 是的 其中 2 个是相同的 没有排序 是否有分而治之的策略 我陷入了如何划分的困境 def is valid i
  • 带路径压缩算法的加权 Quick-Union

    有一种 带路径压缩的加权快速联合 算法 代码 public class WeightedQU private int id private int iz public WeightedQU int N id new int N iz new
  • 生成所有多集大小为 n 的分区的算法

    我一直在试图找出一种方法来生成多重集的所有不同的大小为 n 的分区 但到目前为止却空手而归 首先让我展示一下我想要实现的目标 假设我们有一个输入向量uint32 t std vector
  • 这个按位运算如何检查 2 的幂?

    我正在看一些应该很简单的代码 但我的数学在这里严重失败 下面是一个使用以下条件检查数字是否为 2 的幂的条件 if num 1 num num 1 make num pow of 2 我的问题是 如何在 num 和 num 1 之间使用按位
  • 使用并集查找(又名不相交集)检测图是否是二分图

    我正在 Spoj 上做一个问题 基本上可以简化为检测图是否是二分图 我正在尝试使用 dfs 为图表着色 但它太慢了 有人评论这个 没有 bfs 没有 dfs 没有二部图 简单的并查集就可以做到 确实速度很快 提示 1 偶数长度的环不会影响两
  • 编译器如何实现位域运算?

    当询问如何做的问题时包裹 N 位有符号减法 https stackoverflow com questions 8309538 integer subtraction with wrap around for n bits我得到了以下答案
  • 子序列和

    给定一个整数数组 例如 1 2 3 1 查找是否存在总和为0并返回它 例如 1 2 3 or 2 3 1 检查每个子序列是O n 2 这效率太低了 有改进的想法吗 创建一个新数组 其中每个元素等于前一个元素加上该元素的总和 Input 1
  • 迭代任意大小的子集

    我可以迭代大小为 1 的子集 for int a 0 a lt size a 或大小为 2 的子集 for int a1 0 a1 lt size a1 for int a2 a1 1 a2 lt size a2 or 3 for int
  • 两组点之间的最佳匹配

    I ve got two lists of points let s call them L1 P1 x1 y1 Pn xn yn and L2 P 1 x 1 y 1 P n x n y n 我的任务是找到它们点之间的最佳匹配 以最小化它
  • 用于开始和/或包含搜索的最快字符串集合结构/算法是什么

    我有以下情况 我有一个大的字符串集合 比如说 250 000 平均长度可能是 30 我要做的就是在这些搜索中进行许多搜索 大多数搜索都是 StartsWith 和 Contains 类型的 该集合在运行时是静态的 这意味着选择的集合的初始读
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我
  • 照片马赛克算法。如何在给定基本图像和瓷砖列表的情况下创建马赛克照片?

    Hy 我要做的是创建一个程序 使用 C 或 C 它将 24 位 像素位图和图像集合作为输入 我必须创建一个马赛克图像 类似于使用库的输入图像给定的图像 创建与输入类似的马赛克照片 到目前为止 我可以访问输入的图像像素及其颜色 但我有点卡住了
  • 数学/算法使图像适合屏幕保留纵横比

    我需要数学 算法方面的帮助来拍摄已知尺寸的图像并适合两个屏幕尺寸之一 720 x 480 或 1280 x 1024 图像尺寸来自 XML 文件 但这些尺寸是 Web 尺寸 我还从 XML 中选择了一些图像 这些图像的分辨率可能比 Web
  • 平铺单纯形噪声?

    我 作为业余爱好者 对伪随机噪声生成很感兴趣 特别是 Perlin 和 Simplex 算法 Simplex 的优点是速度 尤其是在更高的维度上 但 Perlin 可以相对容易地平铺 我想知道是否有人知道平铺单纯形算法 固定维度就好 泛型更

随机推荐

  • 凸轮卡扫描仪自动填充未发生

    我的输入字段是这样创建的
  • Javascript 在原型中使用值类型设置对象属性? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 查询 Mongo 中嵌套列表是否存在

    我在 Mongo 中有一个文档 其结构如下 id ObjectId 4eea7237d0ba3a04f20008fb code b2677c2809c844cc9d7e3e4ff8d95b46 city id 4 datetime ISOD
  • 使用 GitHub GUI 提交和同步,一切都消失了

    因此 在 GitHubGUI 中 像往常一样 我进行了更改 然后单击Commit Sync短暂地弹出 合并冲突 对话框 然后一切都消失了 我将最新的更改与远程存储库同步 我所做的一切都消失了 以前在我不断点击后也发生过这种情况commit
  • 如何在 iOS 中使用位图/RGB 数据制作图像动画

    我正在 iPhone 上编写游戏程序 并且有一个想要制作动画的图像 例如位图中行走的人 位图随时间变化 如何有效地将位图添加到屏幕 UIView 加载图像序列的最有效方法是使用 PVR 格式图像并将其作为 OpenGL 纹理加载 PVR 图
  • 特定时间的深度睡眠

    我需要在特定时间激活外设 然后休眠一段时间 然后再次停用外设 我可以用一个简单的方法来做到这一点sleep但这会让我的 ESP32 保持唤醒状态并消耗电池 有没有办法在规定的时间内进入深度睡眠 然后再次醒来 理想情况下 我会简单地安排在一定
  • 为androidTest添加布局资源

    我想将布局 xml 文件添加到我的androidTest仅用于测试的文件夹 I added res layout文件夹到androidTest并尝试向其中添加布局文件 但它给出了错误URI is not registered for xml
  • 无法在 Android 应用程序运行时加载库

    我正在开发 android 应用程序 其中我使用 JNI 作为本机 c 代码 我在 android 2 0 版本和 ndkr3 上构建这个应用程序 它运行良好 现在 当我更改android sdk版本1 5和api版本3时 我遇到了无法打开
  • JavaScript 中获取两个日期之间的差异? [复制]

    这个问题在这里已经有答案了 如何获得全天中 2 个日期之间的差异 我不需要一天的任何分数 var date1 new Date 7 11 2010 var date2 new Date 12 12 2010 var diffDays dat
  • 如何使用 Ember CLI 进行生产就绪构建?

    我一直在 Ember 中构建一个 Web 应用程序 并准备将其放在服务器上以供公众使用 我只想创建 dist 文件夹 然后我将通过 FTP 手动将其上传到服务器 我如何在 Ember 中为此构建一个 dist 我不知道如何打开缩小并从构建中
  • Express 和 nginx net::ERR_CONTENT_LENGTH_MISMATCH

    我正在开发一个 Express 驱动的网站 它通过 nginx 代理 有时在浏览器中加载页面时 我会得到以下信息 GET http myapp local css bootstrap css net ERR CONTENT LENGTH M
  • 如何将参数传递给 p:dataTable 中的 valueChangeListener?

    我正在打电话valueChangeListener on a
  • 根据另一个单元格中的值更改单元格中的值

    搜索了这个但找不到方法 我希望能够将一个单元格中的值转换为不同单元格中的另一个值 如下所示 当列中的单元格A包含Y在列中设置相同数量的单元格B to Male或者当列中的单元格A包含N在列中设置相同数量的单元格B价值Female 例如 A2
  • C相当于fstream的peek

    我知道在 C 中 您可以使用以下命令查看下一个字符 in peek 当尝试 查看 C 中文件的下一个字符时 我该如何解决这个问题 fgetc http opengroup org onlinepubs 007908799 xsh fgetc
  • 使用 Glumpy 将 NumPy 数组显示为持续更新的图像

    我有一个使用 NumPy 和 SciPy 在 Python 中运行的模拟模型 它会生成一个 2D NumPy 数组作为每次迭代的输出 我一直使用 matplotlib 和 imshow 函数将此输出显示为图像 然而 我发现了 Glumpy
  • 将对象列表分组为尽可能少的子列表,但不超过最大总和

    我正在尝试编写一种方法 将对象分组到最少量的子列表中 而无需混合类型 对象上的 int 字段 或其值的总和超过定义的最大值 它应该看起来像这样 List
  • Maven:如何安装 mvnsh?

    我怀疑我的处理方式完全错误 我听说过mvnsh http shell sonatype org 并想尝试一下 以减少构建时的延迟 但我完全不知道如何做到这一点 我仍在学习 Maven 并在两者之间进行错误的比较mvn和类似的工具gem ca
  • 将使用 AWT 和 Swing 绘制电影的 Java 应用程序移植到服务器端

    我正在使用一些代码 使用 AWT 和 Swing 功能将动画输出写入桌面 它使用 2D 图形进行绘制并以字体呈现文本 此代码可以使用 Java Media Framework 将动画保存到电影文件 我想将此代码移植到纯服务器端环境 以便使用
  • 在 Javascript 中从 JSON 数组查找名称值对的有效方法

    我当前正在调用一个服务 该服务将响应作为具有名称值对的对象数组发送 下面是一个例子 这些名称值对的数量可以是任意顺序 但我只想访问名称 name2 的值 除了循环遍历每个对象并检查名称以获得 name2 的相应值之外 还有其他有效的方法吗
  • 按位右展开算法

    本来这篇文章要求逆绵羊和山羊操作 但我意识到这超出了我的实际需要 所以我编辑了标题 因为我只需要一个右展开算法 http programming sirrida de bit perm html c e 这更简单 我在下面描述的示例仍然具有