2012-06-25 21 views
13

Sé cómo configurar un bit, borrar un poco, alternar un poco y comprobar si se ha establecido un bit.C bit opera/copia un bit de un byte a otro byte

Pero, ¿cómo puedo copiar poco, por ejemplo nr 7 de byte_1 a bit nr 7 en byte_2?

Es posible sin una instrucción if (sin verificar el valor del bit)?

#include <stdio.h> 
#include <stdint.h> 
int main(){ 
    int byte_1 = 0b00001111; 
    int byte_2 = 0b01010101; 

    byte_2 = // what's next ? 

    return 0; 
} 
+0

¿Está buscando cómo hacerlo en una sola operación? Si no, haga lo que ya sabe hacer: verifique el bit en byte1, verifique el bit en byte2, si no son lo mismo, configure el bit en byte2. –

+0

no debe estar en una operación, pero quiero evitar verificar antes el valor del bit (si es posible) – astropanic

+0

posible duplicado de [Establecer un bit de un carácter sin signo con el otro bit de otro carácter sin signo sin condicional] (http: //stackoverflow.com/questions/11170740/setting-a-bit-of-an-unsigned-char-with-the-another-bit-of-another-unsigned-char) – Heisenbug

Respuesta

23
byte_2 = (byte_2 & 0b01111111) | (byte_1 & 0b10000000); 
+5

Algunos cambios importantes en la votación están sucediendo aquí ... ¿Qué es esto? –

+1

geezzz ... el voto # en esto está parpadeando cada medio segundo ... – Mysticial

+0

@EitanT sí será 0 – emesx

6

Es necesario leer primero el bit de byte1, borrar el bit de byte2 y or el bit se lee antes:

read_from = 3; // read bit 3 
write_to = 5; // write to bit 5 

the_bit = ((byte1 >> read_from) & 1) << write_to; 
byte2 &= ~(1 << write_to); 
byte2 |= the_bit; 

Tenga en cuenta que la fórmula en la otra respuesta (si la extiendes utilizar variables, en lugar de solo el bit 7) es para el caso en que read_from y write_to tienen el mismo valor.

+0

Si el bit de lectura es un 0, este no lo escribirá en un byte que ya tiene un 1 en esa posición de bit. –

+0

@ CoreyOgburn, a la derecha. Actualicé la respuesta – Shahbaz