Tipos de operadores de turnos en C

Luqman Khan 15 febrero 2024
  1. Operadores de desplazamiento en C
  2. Tipos de operadores de turnos en C
  3. Conclusión
Tipos de operadores de turnos en C

En este artículo, entenderemos los operadores de desplazamiento, que son los tipos de operadores bit a bit que se realizan en los bits de los valores de las variables. Hay dos tipos de operadores de turno: el operador de turno a la izquierda y el operador de turno a la derecha.

Echemos un vistazo a estos operadores.

Operadores de desplazamiento en C

El operador de desplazamiento a la izquierda se caracteriza por el símbolo << y el operador de desplazamiento a la derecha por el símbolo >>. Estos operadores son binarios y requieren dos operandos en ambos lados de los operadores, y ambos deben ser números enteros.

La sintaxis del operador aritmético de desplazamiento a la derecha se proporciona a continuación:

n >> m ;

Estamos desplazando el valor en n a la derecha en m bits. Aquí, n y m son números enteros.

Tipos de operadores de turnos en C

Solo hay un operador de desplazamiento a la derecha >> en C. Los compiladores de C seleccionan qué desplazamiento a la derecha se usa según el tipo de entero que se está desplazando.

El desplazamiento aritmético se utiliza cuando se desplazan los enteros con signo y los enteros sin signo se desplazan mediante el desplazamiento lógico.

En ambos casos, el desplazamiento lógico tiene lugar para el desplazamiento hacia la izquierda o hacia la derecha sin signo, pero no podemos utilizar el desplazamiento lógico en el caso de un valor entero con signo. El cambio lógico puede cambiar el signo, por lo que podemos usar el cambio aritmético para eliminar este problema.

Entonces, en el desplazamiento aritmético a la derecha, el MSB (bit de signo) se copia y se desplaza a la derecha. El efecto es dividir por dos.

La sintaxis de los números con signo:

n1=-n2;

n1>>m1;

En el caso de un número entero con signo, almacene el primer bit en una ranura vacía y mueva la copia al siguiente durante el desplazamiento.

Los desplazamientos a la izquierda aritméticos y lógicos son iguales. Solo los cambios a la derecha difieren para los valores negativos.

Por lo tanto, los programas que realizan cambios a la derecha en valores con signo son inherentemente no portátiles.

Al desplazar un valor a la derecha en n bits, divide el valor por 2 elevado a n, y al desplazar el valor a la izquierda en n bits multiplica el valor por 2 elevado a la potencia de n .

Código de ejemplo:

#include <stdio.h>

int main(void) {
  int dd = -15;
  int ee = 15;
  printf("value of  dd right(sign bit) shift by 1 bits, is %d\n", dd >> 1);
  printf("value of  dd right shift(sign bit) by 2 bits, is %d\n", dd >> 2);
  printf("value of  dd right shift(sign  bit) by 3 bits, is %d\n", dd >> 3);
  printf("value of  dd right shift by 4 bits, is %d\n", dd >> 4);
  printf("value of  ee right shift by 1 bits, is %d\n", ee >> 1);
  printf("value of  ee right shift by 2 bits, is %d\n", ee >> 2);
  printf("value of  ee right shift by 3 bits, is %d\n", ee >> 3);
  return 0;
}

En el código de ejemplo anterior en C, usaremos #include <stdio.h> como un archivo de encabezado de biblioteca que tiene información sobre cómo incluir las funciones relacionadas con la entrada o la salida, como printf() y scanf() funciona en nuestro programa.

La función main es el punto de partida de la ejecución del programa. El sistema operativo inicia la ejecución del programa invocando la función main.

Las siguientes dos variables, dd y ee, se inicializan con dos valores de signo diferentes, positivo y negativo. Entonces el proceso de desplazamiento tiene lugar en la función printf() simplemente por 1, 2 y 3 números, respectivamente, y lo mismo con el valor del signo ee.

Cuando se realiza un desplazamiento aritmético a la derecha en un número negativo, el bit de signo se desplaza y se copia en las ranuras vacías creadas durante el desplazamiento, como en el ejemplo anterior. Ambos valores se desplazan a la derecha, números con signo y sin signo, para los tiempos dados.

En el número sin signo, el cambio es lógico. Se representa en la variable ee que contiene un valor 15, que se desplaza 1 bit, 2 bits y 3 bits a la derecha.

Muestra que dividir el valor por 2 elevó la potencia de un número (bit), por ejemplo, cambiar por 1 bit es 15/2^1, que es igual a 7.

Mientras está en el cambio de valor con signo, el valor del primer bit se copia a sí mismo para el cambio y lo almacena en una ranura vacía durante el cambio.

Producción:

Desplazamiento a la derecha - Salida

El desplazamiento a la derecha para valores con y sin signo es sencillo; los bits vacíos se llenan con ceros. Para valores negativos, el resultado del desplazamiento a la derecha está definido por la implementación.

Usaremos un número par en el siguiente ejemplo para ver los resultados y comprender el funcionamiento del operador de turno a la derecha en números con signo pares e impares. Veamos el código que se muestra a continuación.

#include <stdio.h>

int main(void) {
  int dd = -16;
  int ee = 16;
  printf("value of  dd right(sign bit) shift by 1 bits, is %d\n", dd >> 1);
  printf("value of  dd right shift(sign bit) by 2 bits, is %d\n", dd >> 2);
  printf("value of  dd right shift(sign  bit) by 3 bits, is %d\n", dd >> 3);
  printf("value of  dd right shift by 4 bits, is %d\n", dd >> 4);
  printf("value of  ee right shift by 1 bits, is %d\n", ee >> 1);
  printf("value of  ee right shift by 2 bits, is %d\n", ee >> 2);
  printf("value of  ee right shift by 3 bits, is %d\n", ee >> 3);
  return 0;
}

Producción:

Desplazamiento a la derecha - Salida 2

Conclusión

Se concluye que el desplazamiento lógico (bit de signo) provoca un problema de cambio de signo numérico en el desplazamiento a la derecha, que puede controlarse en el operador aritmético de desplazamiento a la derecha. C y C++ solo tienen desplazamiento aritmético, con algunas áreas sin definir y definidas por la implementación.

Artículo relacionado - C Operator