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

unsigned intに 0x00 バイトが含まれているかどうかを確認します。以下にいくつかの例を示します。

0x11223300
0x11220033
0x11002233
0x00112233

反例として、この数値にはゼロが含まれていますが、ゼロは含まれていませんbyte

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

2 番目の反例として、この数値には 8 つのゼロ ビットが連続していbyteますが、数値を 4 つの構成バイトに分割すると、ゼロは含まれません。

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

編集: 追加の質問に応えて、関数に相当するものを計算している場合のように、文字列で NULL ターミネータを見つけようとしているときにゼロバイトを探しますstrlen()。バイト単位ではなく、一度に 4 バイト (unsigned int) を見ることができます。

于 2013-03-07T18:01:50.817 に答える
2

は32ビット(4バイト)幅であると想定しunsigned int、の少なくとも1バイトxがゼロかどうかをチェックします。

strlen()著者は、4つの連続する文字のブロック内にNULターミネータがあるかどうかをすばやく検出することにより、これを使用して速度を上げることができると主張しています。ない場合はstrlen()、次のブロックに進むことができます。存在する場合は、4バイトを再検討して、そのうちのどれがNULであるかを確認する必要があります。

于 2013-03-07T17:55:56.363 に答える
2

このコードは、数値に 0 バイトがあるかどうかをチェックするだけです。これは、すべて 0 に設定された 8 ビットで構成されるバイトであることを意味します。

0xFF は 255 であるため、x & 255 がゼロの場合、これは最後のバイトのビットがすべてゼロであることを意味します。0xFF00 は 255^2 なので、この場合、2 番目のバイトはすべてゼロで、4 番目のバイトまで続きます。

于 2013-03-07T17:59:01.037 に答える
1

名前が示すように、関数は、パラメーター(4byte unsigned int)に少なくとも1バイトが含まれているかどうかをチェックします。これは、完全にゼロです。

于 2013-03-07T17:56:15.637 に答える
1

x4バイトで構成されます。それらのバイトのいずれかがゼロかどうかをチェックします。

于 2013-03-07T17:56:19.357 に答える
1

これは、次のものと同等であることを意図しています。

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

つまり、占有されているメモリ内のゼロバイトを検索し、そのxようなバイトが見つかったかどうかに応じて true または false を返します。

于 2013-03-07T17:58:33.870 に答える