Quiero extraer bits de un número decimal.
Por ejemplo, 7 es 0111 binario y quiero obtener 0 1 1 1 todos los bits almacenados en bool. ¿Como lo puedo hacer?
Bien, un bucle no es una buena opción, ¿puedo hacer algo más para esto?
c
bit-manipulation
Badr
fuente
fuente
(n >> k) & 1
es igualmente válido y no requiere calcular la máscara ya que la máscara es constante debido al cambio antes de enmascarar en lugar de al revés.struct
archivo también puede ser útil, ya que obtiene todos los datos necesarios con una sola operación.Como se solicitó, decidí extender mi comentario sobre la respuesta de índice a una respuesta completa. Aunque su respuesta es correcta, es innecesariamente compleja. Además, todas las respuestas actuales utilizan
int
s con signo 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 (consulte esta pregunta ).Al desplazar a la derecha el bit deseado a la posición de bit menos significativa, se puede realizar el enmascaramiento
1
. No es necesario calcular un nuevo valor de máscara para cada bit.Como programa completo, calcula (y posteriormente imprime) una matriz de valores de un solo bit:
Suponiendo que desea calcular todos los bits como en este caso, y no uno específico, el bucle se puede cambiar más a
Esto se modifica
input
en su lugar y por lo tanto permite el uso de un desplazamiento de un solo bit de ancho constante, que puede ser más eficiente en algunas arquitecturas.fuente
Aquí hay una forma de hacerlo, hay muchas otras:
Es difícil entender por qué no se desea el uso de un bucle, pero es bastante fácil desenrollar el bucle:
O evaluar expresiones constantes en las últimas cuatro declaraciones:
fuente
He aquí una forma muy sencilla de hacerlo;
fuente
@prateek gracias por tu ayuda. Reescribí la función con comentarios para usarla en un programa. Aumente 8 para obtener más bits (hasta 32 para un número entero).
fuente
Si no quiere ningún bucle, tendrá que escribirlo:
Como se demuestra aquí, esto también funciona en un inicializador.
fuente
fuente
Utilizando
std::bitset
fuente