相关疑难解决方法(0)

C中用于比特反转的最有效算法(从MSB-> LSB到LSB-> MSB)

实现以下目标的最佳算法是什么:

0010 0000 => 0000 0100

转换从MSB-> LSB到LSB-> MSB.所有位必须反转; 也就是说,这不是字节顺序交换.

c algorithm bit-manipulation

232
推荐指数
11
解决办法
22万
查看次数

将字段中的位扩展为掩码中所有(重叠+相邻)设置位的最快方法?

假设我有两个名为IN和MASK的二进制输入。实际字段大小可能是32到256位,具体取决于用于完成任务的指令集。两个输入都会更改每个呼叫。

Inputs:
IN   = ...1100010010010100...
MASK = ...0001111010111011...
Output:
OUT  = ...0001111010111000...
Run Code Online (Sandbox Code Playgroud)

编辑:来自一些评论讨论的另一个示例结果

IN   = ...11111110011010110...
MASK = ...01011011001111110...
Output:
OUT  = ...01011011001111110...
Run Code Online (Sandbox Code Playgroud)

我想获得1位IN所在的MASK的连续相邻1位。(是否有这种操作的总称?也许我没有适当地称呼我的搜索词。)我正在尝试找到一种更快的方法。我愿意使用任何x86或x86 SIMD扩展,这些扩展都可以在最少的cpu周期内完成。首选更广泛的数据类型SIMD,因为它将使我能够立即处理更多数据。

我想出的最好的天真解决方案是以下伪代码,该伪代码手动向左移,直到没有更多匹配的位,然后向右重复:

// (using the variables above)
testL = testR = OUT = (IN & MASK);

LoopL:
testL = (testL << 1) & MASK;
if (testL != 0) {
    OUT = OUT | testL;
    goto LoopL;
}

LoopR:
testR = (testR >> 1) & MASK;
if (testR != 0) {
    OUT = OUT | testR;
    goto …
Run Code Online (Sandbox Code Playgroud)

c x86 assembly sse avx

12
推荐指数
2
解决办法
324
查看次数

32位字的镜像位

你会怎么用C做的?(例如:如果我们必须镜像8位,则10110001变为10001101).某些处理器上是否有任何可以简化此任务的说明?

c assembly bit-manipulation

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

标签 统计

c ×3

assembly ×2

bit-manipulation ×2

algorithm ×1

avx ×1

sse ×1

x86 ×1