2010-02-25 6 views
7

Oye, me estoy autoaprendiendo a nivel de bit, y vi en algún lugar de internet ese cambio aritmético (>>) en medio número. Yo quería probarlo:¿Por qué las medias aritméticas cambian un número solo en ALGUNOS incidentes?

44 >> 1 returns 22, ok 
22 >> 1 returns 11, ok 
11 >> 1 returns 5, and not 5.5, why? 

Otro ejemplo:

255 >> 1 returns 127 
127 >> 1 returns 63 and not 63.5, why? 

Gracias.

+1

bits de Splitting no están permitidos. Lo siento. – leppie

+0

@leppie: huh ??? –

Respuesta

13

El operador de desplazamiento de bits en realidad no se divide por 2. En su lugar, mueve los bits del número hacia la derecha por el número de posiciones dadas en el lado derecho. Por ejemplo:

00101100 = 44 
00010110 = 44 >> 1 = 22 

Aviso cómo los bits en la segunda línea son los mismos que la línea anterior, meramente desplaza un lugar a la derecha. Ahora mira el segundo ejemplo:

00001011 = 11 
00000101 = 11 >> 1 = 5 

Esta es exactamente la misma operación que antes. Sin embargo, el resultado de 5 se debe al hecho de que el último bit se desplaza hacia la derecha y desaparece, creando el resultado 5. Debido a este comportamiento, el operador de desplazamiento a la derecha generalmente será equivalente a dividir por dos y luego tirar cualquier resto o porción decimal.

+0

En la primera oración, creo que quiso decir a la derecha. – Joel

+0

@Joel: Tienes razón. Fijo. –

+0

Bueno, la operación es exactamente la misma que la división entera o la multiplicación por 2^n. – Tronic

1

Binario no tiene ningún concepto de números decimales. Devuelve el valor truncado (int).

11 = 1011 en binario. Cambia a la derecha y tienes 101, que es 5 en decimal.

+0

Es perfectamente posible tener dígitos después del punto 'decimal' en binario. 101.1 tiene perfecto sentido, el dígito después del punto simplemente representa 2^-1 de la misma manera que en decimal representa 10^-1. El problema es que el tipo de datos no almacena los datos de esta manera, por lo tanto, en una operación de cambio de bits el valor se trunca. – JonC

2

11 en binario es 1011

11 >> 1 

significa que cambia su representación binaria a la derecha en un paso.

1011 >> 1 = 101 

entonces usted tiene 101 en binario que es 1 * 1 + 0 * 2 + 1 * 4 = 5.
Si había hecho 11 >> 2 que tendría como resultado 10 en binario es decir, 2 (1 * 2 + 0 * 1).

Cambiando por 1 a la derecha transforma la suma (A_i * 2^i) [i = 0..n] en suma (A_ (i + 1) * 2^i) [i = 0..n-1 ] por eso, si su número es par (es decir, A_0 = 0), está dividido por dos. (perdón por la sintaxis LateX personalizada ... :))

0

El cambio de bit es lo mismo que la división o la multiplicación por 2^n. En aritmética de enteros, el resultado se redondea hacia cero a un número entero. En aritmética de punto flotante, no se permite el cambio de bit.

Cambiando el bit interno, bien, desplaza los bits, y el redondeo simplemente significa que los bits que salen de un borde simplemente se eliminan (no es que realmente calcule el valor preciso y luego lo redondee). Los nuevos bits que aparecen en el borde opuesto siempre son ceros para el lado derecho y para valores positivos. Para valores negativos, se anexan un bit en el lado izquierdo, de modo que el valor permanece negativo (vea cómo funciona two's complement) y la definición aritmética que utilicé sigue siendo verdadera.

0

En la mayoría de los lenguajes de tipo estático, el tipo de devolución de la operación es, p. "En t". Esto excluye un resultado fraccionario, al igual que la división entera.

(Hay mejores respuestas acerca de lo que es 'bajo el capó', pero no es necesario para entender aquellos a asimilar los conceptos básicos del sistema de tipos.)

Cuestiones relacionadas