9

32 ビットのネットマスクが有効か、ビット演算子を使用していないかを確認する方法はありますか?

「1」が連続ストリームにあるかどうかを msb 側から確認する必要があります。たとえば、11111111.0.0.0 (255.0.0.0) は有効ですが、11111101.0.0.0 (253.0.0.0) は無効です。

4

2 に答える 2

16

最初に行うことは、ネットマスクがゼロでないことを確認することです (厄介なエッジ ケース)。これで問題ない場合は、ビット単位の逆数を取得する必要があります。

uint32_t y = ~x;

次に、1つ追加します

uint32_t z = y + 1;

次にx、適切なネットマスクである場合、これには最大で 1 ビットが設定されます。

それをテストするには、単純に をz使用z - 1しますが、たまたまyです。すべてが OK の場合、結果はゼロになり、それ以外の場合は非ゼロになります。

valid = (z & y) == 0;
于 2013-07-01T09:33:57.033 に答える