Bit manipulation 根据多个掩码分割一个比特流的有效方法?

Bit manipulation 根据多个掩码分割一个比特流的有效方法?,bit-manipulation,bit,bitmask,bitstream,Bit Manipulation,Bit,Bitmask,Bitstream,我正在做一个实验,它可以根据一些掩码将一个比特流分割成多个比特流 下面是一个想法示例 这是一个24位的流,每个字母代表1位: abcdefgh ijklmnop qrstuvwx 给定三个掩码,如果它们是[1,1,1,1,1,1,1,1] [1, 1, 0, 0, 1, 0, 0, 0] [0, 0, 1, 0, 0, 0, 1, 1] [0, 0, 0, 1, 0, 1, 0, 0] 将这些遮罩应用于流,如下所示 stream1 = ab__e___ ij__m___ qr__u___ s

我正在做一个实验,它可以根据一些掩码将一个比特流分割成多个比特流

下面是一个想法示例

这是一个24位的流,每个字母代表1位:

abcdefgh ijklmnop qrstuvwx
给定三个掩码,如果它们是[1,1,1,1,1,1,1,1]

[1, 1, 0, 0, 1, 0, 0, 0]
[0, 0, 1, 0, 0, 0, 1, 1]
[0, 0, 0, 1, 0, 1, 0, 0]
将这些遮罩应用于流,如下所示

stream1 = ab__e___ ij__m___ qr__u___
stream2 = __c___gh __k___op __s___wx
stream3 = ___d_f__ ___l_n__ ___t_v__
因此,原始比特流被分成三个比特流,如下所示:

stream1 = abeijmqru
stream2 = cghkopswx
stream3 = dflntv
上面只是一个例子,我需要对给定的比特流应用任意数量的掩码。每个掩模之间保证有
结果为零。Aply
对所有掩码都有一个结果。所有遮罩的长度相同

我写了一个愚蠢的版本来强制执行这个想法,基本上是在循环中一个接一个地移位。我想这肯定是没有效率的

我调查过这件事


没有线索。有谁知道如何改进这一点吗?(在x86机器上)

如果每个位只映射到一个输出流,我认为定义位分配给哪个输出流比使用掩码更有意义。例如,您的示例屏蔽

[1, 1, 0, 0, 1, 0, 0, 0]
[0, 0, 1, 0, 0, 0, 1, 1]
[0, 0, 0, 1, 0, 1, 0, 0]
而是表示为要分配当前位的输出流

[0, 0, 1, 2, 0, 2, 1, 1]
还有一些伪代码把它绑在一起

stream_order = [0, 0, 1, 2, 0, 2, 1, 1]
index = 0
for bit in input_stream:
    n = stream_order[index]
    output_streams[n].push(bit)
    index++
    index %= len(stream_order)

我想,由于您只有一个对应于单个“流”的位,那么您可以同时移动所有这些位,并查看“这属于哪个流”。这将允许适度的并行实现——尽管这将在一定程度上取决于体系结构和掩码的大小——效率如何。这还取决于您希望执行此操作的频率-一定量的预计算将使后续运行更加高效。听起来确实有点蛮力;可能不会比你已经做的更好

当然,有一个可爱的问题(我写了一个公认的答案…)提出了一种通过一次乘法从更大的数字中提取某些位的方法。这种方法的缺点是不能对任何数量的设置位执行此操作-在这两者之间需要有许多空格

原则上,可以通过重复该过程两次或多次,并在其间应用额外的遮罩来解决此问题。让我们看看这对上面问题中的第一个面具是如何起作用的

mask1 = 11001000
num =   abcdefgh
temp = num & mask1 = ab..e...
magic = 4 + 1
answer =     ab..e... 
           ab..e..... + 
           ------------
           ababe.e...
mask2 =    0011100000
ans & mask = abe.....

这将使用掩码乘法掩码(3次操作)将所需的三位数字放在前三位。对于一个八位数字来说效率不是很高;但您可以将其扩展为32位数字,然后它开始看起来更有趣。

如果您能解释一下您要实现的目标,改进什么,这将非常有帮助?这些面具将如何使用?此外,您正在讨论位掩码,但示例包含字符(每个字符由16位表示)。你用的是什么编程语言?@alfasin是我的个人编程实验。我把它添加到问题中。@alfasin我得到的印象是,这些字母只是每个字母的指示符bit@PeterGibson坏主意-如果你处理的是位和字节,就坚持使用它,否则会让人困惑。@alfasin我认为这是一个很好的方法来说明位在掩码中的位置,但是可以更清楚地解释这与我的做法非常相似,但是,
输出流[n].push(bit)
可以通过一些巧妙的bit技巧来改进。经过认真思考,你的答案肯定是最好的!乘法运算的技巧是石头!谢谢