¿Qué significa este operador “>>=” en C?

2 minutos de lectura

avatar de usuario
Rotom92

unsigned long set;
/*set is after modified*/
set >>= 1;

Encontré esto en una llamada al sistema del kernel pero no entiendo, ¿cómo funciona?

avatar de usuario
grijesh chauhan

La expresion set >>= 1; medio set = set >> 1; eso es bits de desplazamiento a la derecha de set por 1 (forma autoasignada de >> Comprobación del operador de desplazamiento a la derecha bit a bit Operadores de desplazamiento bit a bit).

Supongamos que si set es:

BIT NUMBER    31   n=27        m=17                 0
              ▼    ▼           ▼                    ▼
set =         0000 1111 1111 1110 0000 0000 0000 0000

A continuación, después de set >> = 1; variable set se convierte en:

BIT NUMBER    31   n=26        m=16                 0
              ▼     ▼           ▼                   ▼
set =         0000 0111 1111 1111 0000 0000 0000 0000

Observe que el número de bits se desplazó.

Tenga en cuenta un punto interesante: porque set es unsigned long así que esto >> la operación debe ser cambio lógico(desplazamiento sin signo) un desplazamiento lógico no conserva el bit de signo de un número.

Además, debido a que está desplazando todos los bits a la derecha (hacia un número significativo más bajo), por lo que un desplazamiento a la derecha es = dividir el número por dos.

revisa este código (solo para demostrar el último punto):

int main(){
 unsigned long set = 268304384UL;
 set >>= 1;
 printf(" set :%lu \n", set);
 set = 268304384UL;
 set /= 2;
 printf(" set :%lu \n", set);
 return 1; 
}

Y salida:

 set :134152192 
 set :134152192

(nota: no significa >> y / ambos son iguales)

Del mismo modo tienes operador <<= para cambio a la izquierda, consulte otros disponibles Operadores bit a bit y Operadores de asignación compuestostambién consulte la sección: expresiones de bits y diferencia entre: cambio con signo/aritmético y cambio sin signo.

Este “desplazamiento a la derecha” es el valor en un bit. Si mueve todos los bits de un número entero a la derecha en 1, efectivamente “divide entre 2” porque el binario es un sistema de numeración de base 2.

Imagina que tienes el número 12 en binario:

1100 = 12 in binary
 110 =  6 in binary (1100 right-shifted)

Al igual que si moviera todos los dígitos en un número de base 10 uno a la derecha, estaría dividiendo por 10.

Cada operador binario se puede combinar con =. En todos los casos

dest op= expression

es equivalente a

dest = dest op expression

(excepto si dest tiene efectos secundarios, solo ocurren una vez).

Entonces esto significa que

set>>=1;

es equivalente a:

set = set >> 1;

Ya que >> es el operador binario de desplazamiento a la derecha, significa desplazar el valor en set a la derecha por 1 bit.

Esto desplaza el bit a la derecha en 1, lo que equivale a dividir por 2. Para obtener más información sobre el desplazamiento de bits, consulte http://msdn.microsoft.com/en-us/library/f96c63ed(v=vs.80).aspx

El comando anterior realiza el desplazamiento a la derecha en un bit. Consulte las operaciones bit a bit en c desde este enlace http://www.cprogramming.com/tutorial/bitwise_operators.html

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad