bit type c
¿Cómo voltear un bit específico en un byte en C? (4)
En primer lugar, ¡buena suerte!
Una observación: es más útil contar los bits desde la derecha y no hacia la izquierda, ya que hay varios tamaños de bytes / palabras (8 bits, 16 bits, etc.) y ese conteo preserva mejor la compatibilidad. Entonces, en su caso, se refiere a los bits # 7 y # 4 (conteo cero).
¿Querías decir ''voltear'' (cambiar 0 <-> 1 bits) o ''cambiar'' entre uno y otro?
Para la primera opción, la respuesta anterior (XOR con "int mask = 0x90; // 10010000") es muy buena. Para el segundo, es un poco más complicado (pero no mucho).
Estoy tratando de usar máscaras y manipular bits específicos en un byte. Por ejemplo:
Quiero escribir un programa en C que invierta dos bits en posiciones particulares, por ejemplo, el bit en la posición 0 y el que está en la tercera posición. Entonces, 11100011
, se convertiría en 01110011
.
¿Cómo puedo intercambiar estos bits?
La inversión de un bit se realiza mediante XOR con una máscara: establezca los bits en las posiciones que desea voltear y luego ejecute un XOR, como este:
int mask = 0x90; // 10010000
int num = 0xE3; // 11100011
num ^= mask; // 01110011
Aquí hay algunas notas:
- los bits se cuentan normalmente desde la posición menos significativa, por lo que su ejemplo invierte los bits en las posiciones 4 y 7, no en las posiciones 0 y 4
- Para construir una máscara de bits para una sola posición, use la expresión
1 << n
, donden
es el número de posición que cuenta desde el bit menos significativo. - Para combinar varios bits en una sola máscara, use
|
operador. Por ejemplo,(1 << 4) | (1 << 7)
(1 << 4) | (1 << 7)
construye la máscara para voltear los bits 4 y 7.
Para voltear bits, puede utilizar el operador exclusivo OR bitwise. Esto requiere dos operandos (por lo general, el valor que desea operar y la máscara que define qué bits se voltearán). El operador OR exclusivo (XOR) solo cambiará un poco si, y solo si, uno de los dos se establece en 1, pero NO ambos. Vea el ejemplo (simple) a continuación:
#include <stdio.h>
int main(int argc, char** argv)
{
int num = 7; //00000111
int mask = 3; //00000011
int result = num ^ mask; //00000100
printf("result = %d/n", result); //should be 4
return 0;
}
Si su byte es x, y desea cambiar los bits en la posición i-th y j-th:
x = x ^ ((1<<i) | (1<<j));
Entonces, en tu caso, sería (1 << 4) | (1 << 7). :)