type c bit-manipulation bit

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:

  1. 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
  2. Para construir una máscara de bits para una sola posición, use la expresión 1 << n , donde n es el número de posición que cuenta desde el bit menos significativo.
  3. 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). :)