gpt4 book ai didi

c++ - 在 C/C++ 中比较特定半字节的快速方法

转载 作者:搜寻专家 更新时间:2023-10-30 23:57:33 24 4
gpt4 key购买 nike

我有一个面具和一个号码。掩码由值为 0xf 的半字节和一个包含我必须比较的位的半字节组成。 0xf 表示“这些位在比较时不相关”。 示例:

1111 1111 0011 1111 (Mask)
xxxx xxxx 0010 xxxx (Number)
Result: Not Equal since 3dec != 2dec


1111 1111 0011 1111 (Mask)
xxxx xxxx 0011 xxxx (Number)
Result: Equal since 3dec == 3dec

相关半字节的位置可以在掩码内的任何位置。 示例:

0110 1111 1111 1111 (Mask)
0110 xxxx xxxx xxxx (Number)
Result: Equal since 6dec == 6dec

我尝试过 ~、^ 和 & 等,但我无法确定一种简单的方法来获得“真”或“假”。是否有任何解决方案无需移动或每个半字节比较半字节?

最佳答案

正如其他人所指出的,您实际上没有面具;您有一个要比较的 nybbles vector ,其中 nybble 0xf 表示“不关心”。所以第一步是弄清楚要比较和忽略的内容的实际掩码:

uint64_t dont_care = ((mask & 0x7777777777777777ULL) + 0x1111111111111111ULL) & mask;
dont_care &= 0x8888888888888888ULL;
dont_care |= dont_care >> 1;
dont_care |= dont_care >> 2;

这会计算一个真正的掩码——如果 mask nybble 是 0xf,则 dont_care 的每个 nybble 都将是 0xf,否则为 0。请注意,这只需要为每个 mask 值执行一次。它还假定一个 64 位 (16 nybble) 掩码——较小的掩码可以使用较小的类型/常量。

现在您可以简单地测试掩码:

if ((number | dont_care) == mask) { ...

另一种计算 dont_care 的方法是:

uint64_t dont_care = mask & (mask << 1);
dont_care &= dont_care << 2;
dont_care &= 0x8888888888888888ULL;
dont_care |= dont_care >> 1;
dont_care |= dont_care >> 2;

这在某些机器上可能更快(使用更少的大常量,但更多的移位,这在某些 CPU 上很慢)。如果您真的很在意,可以对这两种方法进行分析,看看哪种方法对您的机器来说更快。

还有一种可能性:

uint64_t dont_care = mask & (mask >> 1);
dont_care &= dont_care >> 2;
dont_care &= 0x1111111111111111ULL;
dont_care *= 15;

关于c++ - 在 C/C++ 中比较特定半字节的快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24065662/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com