1

原帖 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;
    }
    
4

6 回答 6

3

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

0x11223300
0x11220033
0x11002233
0x00112233

作为一个反例,虽然这个数字中有零,但它没有零byte

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

byte作为第二个反例,虽然这个数字连续有 8 个零位,但如果将数字分成四个组成字节,它就没有零:

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

编辑: 针对您的附加问题,当您尝试在字符串中查找 NULL 终止符时,您将寻找零字节,就像您正在计算strlen()函数的等效项一样。您可以一次查看 4 个字节(无符号整数),而不是逐字节查看。

于 2013-03-07T18:01:50.817 回答
2

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

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

于 2013-03-07T17:55:56.363 回答
2

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

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

于 2013-03-07T17:59:01.037 回答
1

就像名字说的那样,函数检查参数(4byte unsigned int)是否包含至少一个字节,这个字节完全为零。

于 2013-03-07T17:56:15.637 回答
1

x由四个字节组成。它检查这些字节中的任何一个是否为零。

于 2013-03-07T17:56:19.357 回答
1

它旨在等同于:

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

即在所占用的内存中寻找一个零字节,x根据是否找到该字节返回真或假。

于 2013-03-07T17:58:33.870 回答