Las computadoras son dispositivos binarios. Debido a esto, los números están representados por una secuencia de 1s y 0s.
Bitshifting es simplemente mover esas secuencias de 1s y 0s hacia la izquierda o hacia la derecha.
Así que todo lo que hace el operador >>
es desplazar los bits hacia la derecha un bit.
considerar el número 101:
// Assuming signed 8-bit integers
01100101 // How 101 is represented in binary
00110010 // After right shifting one bit, this represents 50
se truncó El bit menos significativo en este caso. Obviamente, el diablo está en los detalles, pero eso es todo lo que hay realmente.
El operador <<
hace la operación opuesta:
// Assuming signed 8-bit integers
01100101 // How 101 is represented in binary
11001010 // After left shifting one bit, this represents -54
// Assuming unsigned 8-bit integers
01100101 // How 101 is represented in binary
11001010 // After left shifting one bit, this represents 202
En este caso, el bit más significativo se ha truncado desde que utiliza sólo 8 bits. Si el número tenía más bits, sin embargo:
// Assuming signed 16-bit integers
00000000 01100101 // How 101 is represented in binary
00000000 11001010 // After left shifting one bit, this represents 202
00000001 10010100 // After left shifting one bit again, this represents 404
Así que es posible obtener diferentes números dependiendo de la cantidad de bits y los tipos de datos asociados con esos bits se está tratando.
Adición: Si se está preguntando cómo funciona el binario, piense cómo funciona el sistema de números decimales. Considere el número 5287. Se puede escribir así:
5287
Pero también se puede escribirlo así:
5287 = (5 * 1000) + (2 * 100) + (8 * 10) + (7 * 1)
que luego se puede escribir así:
5287 = (5 * 10^3) + (2 * 10^2) + (8 * 10^1) + (7 * 10^0)
La ecuación anterior explica por qué el sistema de números decimales a veces se denomina sistema de base-10. El sistema de números decimales emplea el uso de 10 dígitos (0-9). Observe cómo los exponentes corresponden a la posición del dígito.
El sistema de números binarios, o el sistema base-2, es exactamente lo mismo pero con el número dos como base de los exponentes, y emplea solo dos dígitos: 0 y 1.
5287 = 00010100 10100111 (base 2)
= (0 * 2^15) + (0 * 2^14) + (0 * 2^13) + (1 * 2^12)
+ (0 * 2^11) + (1 * 2^10) + (0 * 2^9) + (0 * 2^8)
+ (1 * 2^7) + (0 * 2^6) + (1 * 2^5) + (0 * 2^4)
+ (0 * 2^3) + (1 * 2^2) + (1 * 2^1) + (1 * 2^0)
Prácticamente, se divide por dos, y el otro se multiplica por dos. –
@Joeri Hendrickx: para enteros, '>>' es de hecho lo mismo que dividir por dos (de qué manera redondea depende del formato exacto) y '<<' es de hecho lo mismo que multiplicar por dos. Es un "truco" útil si necesita multiplicar/dividir por dos en procesadores que no tienen instrucciones de multiplicar/dividir. Recuerda, este truco solo funciona en enteros. Intentar este truco con los números de coma flotante resulta en basura. –