将位掩码拆分为设置位的子掩码

问题描述 投票:0回答:1

我有一个带有少量设置位的掩码,只有 3 或 4 个。 掩码最多可以是 64 位,但让我们举一个简短的例子 -

10100101
我想生成停止在设置位但包括较低位直到前一个停止位的掩码:

00000001
00000110
00111000
11000000

我可以通过隔离最低位并将这些位添加到其右侧来循环执行此操作

((x & -x) << 1) - 1
然后使用 xor 删除之前的掩码。

问题是它可以更有效地并行完成而不用一些 swar 或 simd 循环吗?

assembly bit-manipulation x86-64 simd intrinsics
1个回答
0
投票

服用和使用:

  1 #include <stdio.h>
  2 #include <stdint.h>
  3 void main() {
  4   int32_t val = 0xa5; // input value
  5   int32_t sum = 0, mask;
  6   while(val != 0) {
  7       mask = (val - 1) ^ val;
  8       printf("Mask-out is: %x\n", mask ^ sum);
  9       sum  =  mask;
 10       val &= ~mask;
 11   }
 12 }
© www.soinside.com 2019 - 2024. All rights reserved.