código c para una máscara de red válida

¿Hay alguna forma de verificar que la máscara de red de 32 bits sea válida o no esté utilizando el operador bitwise?

Tengo que verificar desde el lado msb que ‘1’ está en flujo continuo o no. por ejemplo, 11111111.0.0.0 (255.0.0.0) es válido pero 11111101.0.0.0 (253.0.0.0) no lo es.

Lo primero que debe hacer es verificar que la máscara de red no sea cero (un caso desagradable). Dado que esto está bien, es necesario tomar el inverso a nivel de bits.

uint32_t y = ~x; 

Luego agrega uno

 uint32_t z = y + 1; 

Entonces, si x era una máscara de red adecuada, habrá como máximo 1 bit establecido en esto.

Para probar eso, simplemente z con z - 1 , que resulta ser y . El resultado será cero si todo está bien, de lo contrario no será cero.

 valid = (z & y) == 0; 

Para verificar si hay una máscara de red no válida, puede usar el siguiente algoritmo simple:

 mask & (~mask >> 1) 

Esto evaluará a 1 para una máscara de red no válida y 0 para una máscara de red válida.

Una máscara de red válida no puede tener un cero con un uno a la derecha de la misma. Todos los ceros deben tener otro cero a la derecha o ser un bit 0. Si toma los complementos (~) de una máscara de red que tiene un cero con un uno a la derecha y lo desplaza hacia la derecha en una posición de bit , alineará un uno en la máscara de red con uno en el complemento de la máscara de red de uno desplazado. Y si se juntan estos dos valores, se producirá uno que indica una máscara de red no válida.

Asegúrese de usar ntohl () para convertir la máscara de red al orden de bytes de host antes de aplicar este algoritmo si está en orden de bytes de red. Además, debe realizar comprobaciones especiales para 0xffffffff y 0x00000000 si desea excluirlos.

Nota: Debido a las reglas de precedencia y asociatividad de C para los operadores, los paréntesis que se muestran en el algoritmo no son necesarios, pero los he agregado para facilitar la comprensión del código en caso de que no siempre recuerde las reglas de precedencia y asociatividad.

 int is_netmask_valid(uint32_t mask) { if (mask == 0) return 0; if (mask & (~mask >> 1)) { return 0; } else { return 1; } }