unsigned long set;
/*set is after modified*/
set >>= 1;
Encontré esto en una llamada al sistema del kernel pero no entiendo, ¿cómo funciona?
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?
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