相关疑难解决方法(0)

使用单个乘法提取位

我看到在使用了一个有趣的技术,答案另一个问题,并想好一点理解.

我们给出了一个无符号的64位整数,我们对以下几位感兴趣:

1.......2.......3.......4.......5.......6.......7.......8.......
Run Code Online (Sandbox Code Playgroud)

具体来说,我们希望将它们移到前八位,如下所示:

12345678........................................................
Run Code Online (Sandbox Code Playgroud)

我们不关心指示的位的值.,并且不必保留它们.

溶液是屏蔽掉不需要的位,并且乘以结果0x2040810204081.事实证明,这就是诀窍.

这种方法有多普遍?这种技术可以用来提取任何比特子集吗?如果不是,如何判断该方法是否适用于特定的位组?

最后,如何找到(a?)正确的乘数来提取给定的位?

c bit-manipulation multiplication

298
推荐指数
5
解决办法
2万
查看次数

如何用8个bool值创建一个字节(反之亦然)?

我有8个bool变量,我想将它们"合并"成一个字节.

有一个简单/首选的方法来做到这一点?

相反,如何将一个字节解码为8个独立的布尔值?

我认为这不是一个不合理的问题,但由于我无法通过谷歌找到相关文档,它可能是另一个"非你所有直觉都是错误的"案例.

c++ boolean bit-manipulation bit-packing

20
推荐指数
4
解决办法
2万
查看次数

像 PEXT 这样的汇编指令实际上有什么用途?

我观看了有关十大最疯狂汇编语言指令的 YouTube 视频,其中一些指令对我来说没有明显的应用。像这样的东西有什么意义PEXT,它只取第二个参数中与第一个参数中的 1 索引相匹配的位?编译器如何知道何时使用该指令?关于无进位乘法的相同/相似问题。

免责声明:我对汇编语言知之甚少甚至一无所知。也许我应该读一下它!

我希望这个问题适合 stackoverflow。

x86 assembly bit-manipulation bmi

6
推荐指数
2
解决办法
2500
查看次数

如何有效地将两个16位字组合成一个32位字?

我必须将两个16位字组合成一个32位字数百次,这需要很多计算能力.我想找到一种更有效的方法来做到这一点.

我有2个16位字,名为A和B.我想要一个名为C的32位字.A中的位应复制到C中的偶数位.B中的位应复制到奇数位中. C.例如:A:0b0000000000000000 B:0b1111111111111111处理后的C应为0b10101010101010101010101010101010.

我目前的解决方案如下:

for (i = 0; i < 32; i+=2)
{
    C |=  (A & (1 << (i/2))) << (i/2);
    C |=  (B & (1 << (i/2))) << (i/2 + 1);
}
Run Code Online (Sandbox Code Playgroud)

当我有几百个C要处理时,这个解决方案需要花费太多时间.我正在寻找一个更好的!

补充:该程序在TriCore上运行.我别无选择,只能以这种方式处理数据,因为AB和C之间的这种关系是由协议定义的.

谢谢!

c embedded performance bitwise-operators

5
推荐指数
2
解决办法
1456
查看次数

不使用BMI2的便携式有效替代PDEP?

英特尔位操作指令集2(BMI2)中的并行存款指令(PDEP)的文档描述了该指令的以下串行实现(类似C的伪代码):

U64 _pdep_u64(U64 val, U64 mask) {
  U64 res = 0;
  for (U64 bb = 1; mask; bb += bb) {
    if (val & bb)
      res |= mask & -mask;
    mask &= mask - 1;
  }
  return res;
}
Run Code Online (Sandbox Code Playgroud)

另请参阅英特尔的pdepinsn参考手册.

该算法是O(n),其中n是设置位的数量mask,这显然具有O(k)的最坏情况,其中k是总的位数mask.

更有效的最坏情况算法是否可行?

是否有可能制作一个更快的版本,假设val最多有一个位设置,即等于0或等于0到63之间的1<<r某个值r

algorithm x86 assembly bit-manipulation bmi

5
推荐指数
2
解决办法
619
查看次数

在一个字中间隔位的快速方法是什么?

我在64位寄存器的低位部分有一个32位值;顶部部分是 0。让我们X用信息来表示一个位,并用从 LSB 到 MSB 列出的位来表示,如下所示:

X X X  ...  X 0 0 0 0 ... 0
Run Code Online (Sandbox Code Playgroud)

现在,我想用信息“间隔”这些位,这样我就有了

X 0 X 0 X 0 ... X 0
Run Code Online (Sandbox Code Playgroud)

(或者如果你想把 0 放在前面,那么

0 X 0 X 0 X 0 ... X
Run Code Online (Sandbox Code Playgroud)

也很好。)

有什么快速的方法可以做到这一点?

与多 CPU 架构相关的答案会很好,但特定于 Intel x86_64 和/或 nVIDIA Pascal SM 的答案将是最相关的。

performance bitwise-operators

1
推荐指数
1
解决办法
472
查看次数