相关疑难解决方法(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万
查看次数

将屏蔽位移到lsb

当你and使用掩码的某些数据时,你会得到一些与数据/掩码大小相同的结果.我想要做的是取结果中的掩码位(掩码中有1)并将它们向右移动,使它们彼此相邻,我可以对它们执行CTZ(计数尾随零) .

我不知道如何命名这样的程序,所以谷歌让我失望.该操作最好不应该是循环解决方案,这必须尽可能快地操作.

这是一个用MS Paint制作的令人难以置信的图像. 在此输入图像描述

c c++ bitmask

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

C/C++将signed char打包成int

我需要将四个带符号的字节打包成32位整数类型.这就是我的目标:

int32_t byte(int8_t c) { return (unsigned char)c; }

int pack(char c0, char c1, ...) {
  return byte(c0) | byte(c1) << 8 | ...;
}
Run Code Online (Sandbox Code Playgroud)

这是一个很好的解决方案?它是便携式的(不是通信意义上的)吗?是否有现成的解决方案,或许可以提升?

问题我最关心的是将负位从char转换为int时的位顺序.我不知道应该是什么样的正确行为.

谢谢

c c++ signed byte packing

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

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

我在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
查看次数