提问人:António Leitão 提问时间:3/10/2023 最后编辑:cafce25António Leitão 更新时间:3/15/2023 访问量:76
有没有一种快速的方法来按索引(而不仅仅是屏蔽)提取位?
Is there a fast method to extract bits by index (not just masking)?
问:
我有一个特定的二进制数,例如:11110000 以及正好设置了 4 位的掩码:10101010 我正在寻找一个快速操作,该操作将返回与设置掩码的位置相对应的 4 位输入:
11110000 10101010 产量:1100
在这里,我使用 u8 到 u4,但想象一下 u64 到 u32。有没有一种快速的方法可以在不循环的情况下做到这一点(在 Rust 或 C 中)?
我尝试循环索引和线性分解。两者都非常慢,因为一个需要循环,另一个需要矩阵分解。
答:
0赞
Matt Timmermans
3/15/2023
#1
如果可以预处理选择掩码,则可以在掩码和移位操作的 log(width) 数中执行此操作。
如果您的选择蒙版中有任何奇数大小的间隙,那么您可以首先应用位蒙版向右移动一个位置,结果您想要的位之间只会有偶数大小的间隙。
例如,从 的选择掩码 开始,向右移动 1 位的位是 。移动这些位后,要应用的新选择蒙版是 ,它只有偶数大小的间隙。10101010
00100010
10011001
然后有一个蒙版,用于向右移动 2 个位置,这将使您的所有间隙大小可以被 4 整除:10011001
-> 10000111
如果继续这样,直到间隙大小可以被字长整除,那么就不会有任何间隙:10000111
-> 00001111
要计算这些掩码,首先计算每个位位置所需的总位移。第一个掩码从所有奇数总位移中清除 1 位。第二个掩码清除 2 位,依此类推。
评论