2010-10-13 13 views

Respuesta

26

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) 
+3

Prácticamente, se divide por dos, y el otro se multiplica por dos. –

+2

@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. –

3

>> el operador SHIFT RIGHT

Ejemplo:

class X 
     { 
     public static void main(String args[]) 
     { 
     System.out.println("20>>2 = "+20>>2); 
     } 
     }   

de salida: 20>>2 = 5

Explicación:

valor binario de 20 es: 00000000000000000000000000010100

desplazar todos los bits 2 posiciones a la derecha 00000000000000000000000000000101

Dará 5 (2*2^2+0*2^1+1*2^0)

3

¿Puedo suponer que el chico que estoy hablando con sabe un poco de binario? :)

Todos los números se pueden representar en algún tipo de binario, así:

Base 10 : Base 2 
    1 : 0001 
    2 : 0010 
    3 : 0011 
    4 : 0100 
    5 : 0101 
    6 : 0110 
    7 : 0111 
    8 : 1000 

... y así sucesivamente.

Los operadores de desplazamiento básicamente mueven todos los bits (1s o 0s) en una posición. Así, por ejemplo: 000111 >> 1

desplaza todos los bits en 000.111 derecha por un número para producir esto:

turnos todos esos bits dejaron por uno, para producir este:

Si cambia por más de uno, entonces solo mueve los bits aún más.

Ahora, dependiendo del idioma que use y el tipo de números con los que esté trabajando, puede ser un poco más complicado. Por ejemplo, si trabaja en un idioma donde el "bit más significativo" (el que está más a la izquierda en un número) representa si el número está firmado o no, entonces el idioma tendrá que tenerlo en cuenta.

Matemáticamente hablando, si se toma un entero (e ignorar el riesgo de desbordamientos, que son causadas por el equipo que ejecuta sin espacio para almacenar bits) desplazamiento a la izquierda en 1 (< < 1) es el equivalente a multiplicar por 2, y cambiar a la derecha por 1 es el equivalente a dividir por 2. (Piense un poco sobre lo que vale un "valor posicional" en las matemáticas binarias, y eso tendrá sentido)