Según lo solicitado, decidí extender mi comentario en la respuesta del índice a una respuesta en toda regla. Aunque su respuesta es correcta, es innecesariamente compleja. Además, todas las respuestas actuales utilizan int
s firmado para representar los valores. Esto es peligroso, ya que el desplazamiento a la derecha de los valores negativos está definido por la implementación (es decir, no es portátil) y el desplazamiento a la izquierda puede conducir a un comportamiento indefinido (ver this question).
Al desplazar a la derecha la broca deseada a la posición de bit menos significativa, se puede enmascarar con 1
. No es necesario calcular un nuevo valor de máscara para cada bit.
(n >> k) & 1
Como un programa completo, la informática (y posteriormente imprimir) una matriz de valores de un solo bit:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
unsigned
input = 0b0111u,
n_bits = 4u,
*bits = (unsigned*)malloc(sizeof(unsigned) * n_bits),
bit = 0;
for(bit = 0; bit < n_bits; ++bit)
bits[bit] = (input >> bit) & 1;
for(bit = n_bits; bit--;)
printf("%u", bits[bit]);
printf("\n");
free(bits);
}
Suponiendo que se desea calcular todos los bits como en este caso, y no una específica , el bucle se puede cambiar más a
for(bit = 0; bit < n_bits; ++bit, input >>= 1)
bits[bit] = input & 1;
Esto modifica input
en su lugar y de esta manera permite el uso de una anchura constante, el cambio de un solo bit, que puede ser más eficiente en algunos una arquitecturas.
'(n >> k) y 1' es igualmente válido y no requiere el cálculo de la máscara como la máscara es constante debido a los cambios antes de enmascaramiento en lugar de a la inversa alrededor. – Joe
@Joe, ¿puedes explicar eso, quizás en una respuesta, por favor? –
@Yar extendió un poco mi comentario y agregó una nueva respuesta según lo solicitado – Joe