C++ 在整数中测试4个字节的零

C++ 在整数中测试4个字节的零,c++,algorithm,bit,C++,Algorithm,Bit,我来这里是要耍花招。我有一个32位的整数,是4个字节。我想测试每个字节的零,如果其中一个为true,则返回true 例如 有什么技巧可以在最少的CPU周期内完成吗?您可以通过屏蔽&operation中的每个字节并将结果与零进行比较来测试它: bool hasZeroByte(int32_t n) { return !(n & 0x000000FF) || !(n & 0x0000FF00) || !(n & 0x00FF0000)

我来这里是要耍花招。我有一个32位的整数,是4个字节。我想测试每个字节的零,如果其中一个为true,则返回true

例如


有什么技巧可以在最少的CPU周期内完成吗?

您可以通过屏蔽&operation中的每个字节并将结果与零进行比较来测试它:

bool hasZeroByte(int32_t n) {
    return !(n & 0x000000FF)
        || !(n & 0x0000FF00)
        || !(n & 0x00FF0000)
        || !(n & 0xFF000000);
}

您可以通过屏蔽&operation中的每个字节并将结果与零进行比较来测试它:

bool hasZeroByte(int32_t n) {
    return !(n & 0x000000FF)
        || !(n & 0x0000FF00)
        || !(n & 0x00FF0000)
        || !(n & 0xFF000000);
}

实现这一点的最快方法可能是使用strnlen,因为大多数编译器都会对此进行优化,以使用低级指令来查找字符串中的零字节

bool hasZeroByte(int32_t n) {
    return strnlen(reinterpret_cast<char *>(&n), 4) < 4;
}
对于那些不相信这个答案的人,请随意看一下,看看它已经在做其他答案中提到的所有小把戏了

另见:


实现这一点的最快方法可能是使用strnlen,因为大多数编译器都会对此进行优化,以使用低级指令来查找字符串中的零字节

bool hasZeroByte(int32_t n) {
    return strnlen(reinterpret_cast<char *>(&n), 4) < 4;
}
对于那些不相信这个答案的人,请随意看一下,看看它已经在做其他答案中提到的所有小把戏了

另见:


在著名的页面中有几种方法

并且可能是编译到汇编时最简洁的方法

#define haszero(v) (((v) - 0x01010101UL) & ~(v) & 0x80808080UL)
因为它们是技巧,很难理解,所以如果你想清楚,就屏蔽每个字节,然后像dasblinkenlight的答案一样检查


在著名的页面中有几种方法

并且可能是编译到汇编时最简洁的方法

#define haszero(v) (((v) - 0x01010101UL) & ~(v) & 0x80808080UL)
因为它们是技巧,很难理解,所以如果你想清楚,就屏蔽每个字节,然后像dasblinkenlight的答案一样检查


这可能不是最快的方法,因为| |需要分支。您可能想在一个小的基准测试中使用它,看看用| |替换| |是否会带来任何好处。实际上~&不是^?这可能不是最快的方法,因为| |需要分支。您可能想在一个小的基准测试中使用它,看看用|替换| |是否会带来任何好处。这不是~&实际上是^?这并没有利用SSE2或AVX来加速字符串操作。与许多其他方法相比,它包含了很多逻辑,因此对于这个简单的情况,它可能不会更快。此外,它是strlen,而不是strnlen。它不使用SSE2或AVX来加速字符串操作。与许多其他方法相比,它包含了很多逻辑,因此对于这个简单的情况,它可能不会更快。而且是斯特伦,不是斯特伦
#define haszero(v) (((v) - 0x01010101UL) & ~(v) & 0x80808080UL)