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

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

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

El set >>= 1; expresiones set >>= 1; significa set = set >> 1; es decir, bits de desplazamiento a la derecha set por 1 (forma auto asignada de >> operador de desplazamiento a la derecha a nivel de bit check check Operadores de cambio a la izquierda de Bitwise ).

Supongamos que si se set es:

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

Luego, después de set >> = 1; set variables set convierte en:

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

Observe el número de bits cambiado.

Tenga en cuenta un punto interesante: dado que el set unsigned long está unsigned long por lo que esta operación >> debería ser un cambio lógico ( cambio 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), un cambio a la derecha es = dividir el número entre dos.

verifique 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)

De manera similar, tiene el operador <<= para el desplazamiento a la izquierda, verifique otros operadores de Bitwise y operadores de asignación compuesta disponibles, también revise la sección: expresiones de bits y diferencia entre: desplazamiento 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 entero a la derecha por 1, entonces efectivamente “divide por 2” porque 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 de un número de base 10 a la derecha por uno, estaría dividiendo por 10.

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

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

 dest op= expression 

es equivalente a

 dest = dest op expression 

(excepto si el dest tiene efectos secundarios, solo se producen una vez).

Entonces esto significa que

 set>>=1; 

es equivalente a:

 set = set >> 1; 

Dado que >> es el operador binario de desplazamiento a la derecha, significa cambiar el valor en el valor correcto en 1 bit.

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