"Detects zero bytes inside a 32 bit integer"的这段代码有什么用?

What is the use of this code that "Detects zero bytes inside a 32 bit integer"?

本文关键字:代码 什么 段代码 bytes zero Detects inside integer bit      更新时间:2023-10-16

原帖http://bits.stephan-brumme.com/null.html

  1. 这段代码是做什么的?(回复,谢谢)

  2. 在哪里使用?

    bool hasZeroByteSimple(unsigned int x)
    {
        if ((x & 0x000000FF) == 0)
            return true;
        if ((x & 0x0000FF00) == 0)
            return true;
        if ((x & 0x00FF0000) == 0)
            return true;
        if ((x & 0xFF000000) == 0)
            return true;
        return false;
    }
    

检查unsigned int中是否有0x00字节,以下是一些示例:

0x11223300
0x11220033
0x11002233
0x00112233

作为一个反例,尽管这个数字有零,但它没有零byte:

0x70801206 (bytes: 0x70, 0x80, 0x12, 0x06)

作为第二个反例,尽管这个数字在一行中有8个0位,但如果你将这个数字分解成它的四个组成字节,它就没有零byte:

0x10023456 (bytes: 0x10, 0x02, 0x34, 0x56)

EDIT:在回答您的其他问题时,当您试图在字符串中找到NULL终止符时,您将查找零字节,就像您正在计算strlen()函数的等量一样。您可以一次查看4个字节(unsigned int),而不是逐个字节查看。

假设unsigned int为32位(4字节)宽,并检查x中是否至少有一个字节为零。

作者认为这可以用来加快strlen(),通过快速检测在四个连续字符的块中是否存在NUL终止符。如果没有,strlen()可以移动到下一个区块;如果有,则需要重新检查这四个字节,以确定其中哪个是NUL。

这段代码只是检查数字是否有一个零字节,这意味着它是一个由8位组成的字节,全部设置为零。

0xFF是255,所以如果x &255是零,这意味着最后一个字节都是零。0xFF00是255^2,所以在这种情况下,第二个字节都是零,以此类推,直到第四个字节。

正如其名称所示,该函数检查形参(4byte unsigned int)是否至少包含一个字节,该字节完全为零。

x由四个字节组成。它检查这两个字节是否有一个为零。

相当于:

return memchr(&x, 0, sizeof x);

也就是说,它在x占用的内存中搜索一个零字节,并根据是否找到这样一个字节返回true或false。