Acceder y almacenar un bit desde un uint8

0

Necesito acceder a un bit particular desde una variable uint8 , y almacenar este valor de bit a otra variable uint8 . En este momento estoy haciendo lo siguiente para lograr esto:

bit_value = (uint8_variable & (1 << BIT_POSITION)) >> BIT_POSITION;

¿Es este el método correcto? Si es correcto, ¿hay una manera más sencilla de lograr esto?

Actualizar: Una pregunta más. Necesito establecer un bit particular en un uint8 a un valor X (no cambiar el bit). por ejemplo: en 1100 0101, necesito configurar el bit 2 en X, sin modificar los otros bits, para obtener 1100 0X01. He estado atormentando mi cerebro, pero no puedo aterrizar en una solución directa.

    
pregunta Soju T Varghese

3 respuestas

4

Tengo una idea, al menos lo haría así. Asi que,  %código% Así que esto cambiaría el bit que necesita en la posición LSB, y la & operador enmascararía los otros bits. Ejemplo: bit_value = ((uint8_variable>>BIT_NEEDED)&1)

Creo que esto debería funcionar correctamente. Recuerda contar los bits desde 0.

    
respondido por el user43648
2

Una de las cosas a tener en cuenta es la cantidad de ciclos de CPU necesarios para realizar cambios. Algunos procesadores tienen un cambiador de barriles que, por lo tanto, se desplazan en 1 o en 3,4, .. N toma el mismo tiempo.

Los microcontroladores a menudo pueden cambiar solo 1 posición por ciclo de reloj. Así, >> 7 toma 7 relojes.

Por lo tanto uso a menudo:

new_pos = (old_pos & (1 << BIT_POSITION)) ? (1 << NEW_BIT_POSITION) : 0;

Una segunda ventaja es que su nueva posición de bit puede ser izquierda o derecha de la anterior. A este código no le importa eso, ya que de lo contrario hay que pensar en cambiar de derecha a izquierda.

Por supuesto, una pequeña variante le permite agregar bits a una variable existente:

new_pos |= (old_pos & (1 << BIT_POSITION)) ? (1 << NEW_BIT_POSITION) : 0;
    
respondido por el Oldfart
1
  

Actualización: Una pregunta más. Necesito establecer un bit particular en un uint8   a un valor X (no alternar el bit). por ejemplo: en 1100 0101, necesito configurar   bit 2 a X, sin modificar los otros bits - para obtener 1100 0X01. yo   He estado atormentando mi cerebro, pero no puedo aterrizar directamente.   solución.

Para lograr esto:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

#define BIT_POSITION 2
#define SET_BIT 1
#define CLR_BIT 0


uint8_t setOrClearBit(uint8_t variable, uint8_t bit_position, uint8_t setOrClear)
{
    if(setOrClear) {
        variable |= (1<<bit_position); 
    }
    else {
        variable &= ~(1<<bit_position);
    }
    return variable;
}

uint8_t test = 0b11000001;
int main(void)
{
     printf("%d\n", setOrClearBit(test, BIT_POSITION, SET_BIT));
    printf("%d\n", setOrClearBit(test, BIT_POSITION, CLR_BIT));

}

O si no se requieren condiciones:

uint8_t setOrClearBit(uint8_t variable, uint8_t bit_position, uint8_t setOrClear)
{
    variable = (variable & ~(1<<bit_position)) | (setOrClear<<bit_position);
    return variable; 
}
    
respondido por el Fasset

Lea otras preguntas en las etiquetas