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