32 ビットのネットマスクが有効か、ビット演算子を使用していないかを確認する方法はありますか?
「1」が連続ストリームにあるかどうかを msb 側から確認する必要があります。たとえば、11111111.0.0.0 (255.0.0.0) は有効ですが、11111101.0.0.0 (253.0.0.0) は無効です。
32 ビットのネットマスクが有効か、ビット演算子を使用していないかを確認する方法はありますか?
「1」が連続ストリームにあるかどうかを msb 側から確認する必要があります。たとえば、11111111.0.0.0 (255.0.0.0) は有効ですが、11111101.0.0.0 (253.0.0.0) は無効です。
最初に行うことは、ネットマスクがゼロでないことを確認することです (厄介なエッジ ケース)。これで問題ない場合は、ビット単位の逆数を取得する必要があります。
uint32_t y = ~x;
次に、1つ追加します
uint32_t z = y + 1;
次にx
、適切なネットマスクである場合、これには最大で 1 ビットが設定されます。
それをテストするには、単純に をz
使用z - 1
しますが、たまたまy
です。すべてが OK の場合、結果はゼロになり、それ以外の場合は非ゼロになります。
valid = (z & y) == 0;