0Pricing
C Academy · Lección

Desplazamientos

Desplazamiento a izquierda y derecha

Desplazamientos es una lección gratuita de C Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C Academy incluye 4 lecciones en total.

Desplazar bits

Los operadores de desplazamiento mueven todos los bits de un entero hacia la izquierda o hacia la derecha una cantidad determinada de posiciones.

El desplazamiento a la izquierda es << y el desplazamiento a la derecha es >>.

#include <stdio.h>

int main(void) {
    unsigned x = 1;
    printf("1 << 3 = %u\n", x << 3);
    return 0;
}

El desplazamiento a la izquierda multiplica

Desplazar n posiciones a la izquierda multiplica un valor sin signo por 2 elevado a n.

1 << 3 es 8 y 5 << 1 es 10.

#include <stdio.h>

int main(void) {
    printf("5 << 1 = %u\n", 5u << 1);
    printf("3 << 4 = %u\n", 3u << 4);
    return 0;
}

El desplazamiento a la derecha divide

Desplazar n posiciones a la derecha divide un valor sin signo por 2 elevado a n y descarta los bits que salen por el extremo derecho.

20 >> 2 es 5.

#include <stdio.h>

int main(void) {
    printf("20 >> 2 = %u\n", 20u >> 2);
    printf("7 >> 1 = %u\n", 7u >> 1);
    return 0;
}

Potencias de dos

Desplazar 1 a la izquierda es la forma más rápida de generar potencias de dos.

1 << n es la potencia n de dos.

#include <stdio.h>

int main(void) {
    for (int n = 0; n < 6; n++) {
        printf("2^%d = %u\n", n, 1u << n);
    }
    return 0;
}

Visualizar un desplazamiento

Imprimir los bits antes y después muestra cómo se desplaza el patrón.

#include <stdio.h>

void print_bits(unsigned char v) {
    for (int i = 7; i >= 0; i--) putchar((v >> i) & 1 ? '1' : '0');
    putchar('\n');
}

int main(void) {
    unsigned char v = 0b00000110;
    print_bits(v);
    print_bits(v << 2);
    return 0;
}

Extraer un bit

Para leer el bit número i, desplace el valor i posiciones a la derecha y aplique una máscara con 1.

El resultado es 0 o 1.

#include <stdio.h>

int main(void) {
    unsigned v = 0b10110;
    for (int i = 0; i < 5; i++) {
        printf("bit %d = %u\n", i, (v >> i) & 1);
    }
    return 0;
}

Construir un valor bit a bit

Puede ensamblar un número colocando los bits en su posición mediante desplazamientos y combinándolos con OR.

#include <stdio.h>

int main(void) {
    unsigned v = 0;
    v |= (1u << 0);
    v |= (1u << 2);
    v |= (1u << 4);
    printf("v = %u\n", v);
    return 0;
}

Precaución con el desplazamiento a la derecha con signo

Desplazar a la derecha un entero negativo con signo está definido por la implementación: es posible que se copie el bit de signo.

Para realizar operaciones bit a bit predecibles, prefiera los tipos unsigned.

#include <stdio.h>

int main(void) {
    int s = -8;
    printf("-8 >> 1 = %d (implementation-defined)\n", s >> 1);
    unsigned u = 8;
    printf("8u >> 1 = %u\n", u >> 1);
    return 0;
}

Evite desplazar demasiado

Desplazar una cantidad mayor o igual que el ancho del tipo produce comportamiento indefinido.

No está permitido desplazar un valor de 32 bits 32 posiciones o más.

#include <stdio.h>
#include <limits.h>

int main(void) {
    printf("unsigned has %zu bits\n", sizeof(unsigned) * CHAR_BIT);
    printf("Safe shift 1u << 31 = %u\n", 1u << 31);
    return 0;
}

Combinar desplazamiento y máscara

El desplazamiento y la máscara juntos permiten extraer un campo de varios bits. Aquí extraemos los 4 bits centrales de un byte.

#include <stdio.h>

int main(void) {
    unsigned v = 0b11010110;
    unsigned field = (v >> 2) & 0b1111;
    printf("field = %u\n", field);
    return 0;
}

Multiplicación y suma rápidas

Combinar desplazamientos permite multiplicar rápidamente por constantes. Multiplicar por 10 equivale a desplazar 3 posiciones (por 8) y sumar un desplazamiento de 1 posición (por 2).

#include <stdio.h>

int main(void) {
    unsigned x = 7;
    unsigned times10 = (x << 3) + (x << 1);
    printf("7 * 10 = %u\n", times10);
    return 0;
}

Comprobación rápida

Compruebe sus conocimientos sobre los desplazamientos.

Resumen

Ha aprendido sobre los operadores de desplazamiento:

  • << desplaza a la izquierda y multiplica por potencias de dos.
  • >> desplaza a la derecha y divide por potencias de dos.
  • (v >> i) & 1 extrae un solo bit.
  • Use unsigned para obtener desplazamientos predecibles y nunca desplace el ancho del tipo o más posiciones.

Preguntas frecuentes

¿La lección «Desplazamientos» es gratis?

Sí — el texto completo de «Desplazamientos» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C Academy, actualiza a CoddyKit PRO. El curso de C Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Desplazamientos»?

Desplazamiento a izquierda y derecha Practicas C Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar C Academy?

No se requiere experiencia previa. C Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «Desplazamientos»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de C Academy?

Sí. Cada lección de C Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Operadores bit a bit
  2. Desplazamientos
  3. Máscaras de bits y flags
  4. Trucos prácticos con bits
← Volver a C Academy