No entiendo bien el planteo respecto de las máscaras. Que un bit sea 0 no significa que se anule. Veamos si con un par de ejemplos se entiende mejor el tema
Imaginemos que se reciben 16 bits pero sólo nos interesan desde el 0 hasta el 11.. Llamaremos "dato1" a la variable en la cual se almacena lo recibido y "dato_con_mascara" (que original!
) a la variable a la cual ya le apliqué la máscara. La máscara tiene que ser 0b0000111111111111 (sólo tienen que estar en 1 los bits que nos interesen).
En primera instancia dato1 = 0b1010101010101010. Ahora, al aplicar la máscara quedaría así....
dato_con_mascara = dato1 & 0b0000111111111111 --> dato_con_mascara = 0000101010101010
dato1 0b1010101010101010
mascara 0b0000111111111111
dato_con_mascara 0b0000101010101010 // lo puse en esa forma para que se lea mejor el resultado de la AND
como verás los bits 0..11 siguen manteniendo el valor original de la variable dato1
si ahora dato1 = 1111000011001100
dato_con_mascara = dato1 & 0b0000111111111111 --> dato_con_mascara = 0b0000000011001100
dato1 0b1111000011001100
mascara 0b0000111111111111
dato_con_mascara 0b0000000011001100
como verás los bits 0..11 siguen manteniendo el valor original de la variable dato1