Sistema Binario

From SA-MP Wiki

Jump to: navigation, search

Contents

Sistema Binario

¿Qué es el sistema binario?

El sistema binario es un sistema numérico que usa únicamente dos símbolos para representar números. Mientras el sistema decimal usa diez números (base 10), el sistema binario usa solamente el 0 y el 1. Este sistema puede parecer inútil, sin embargo, es esencial cuando se trata de computadoras. En su más bajo nivel, las computadoras realizan todos sus cálculos manipulando el flujo de electricidad para indicar dos estados: encendido y apagado. Esto es exactamente lo qué es el sistema binario, solo un montón de interruptores encendidos y apagados. Para entender mejor el concepto, vamos a comparar el sistema binario con el decimal.

Sistema Decimal (Base 10)

0
1
2
3
4
5
6
7
8
9
10
11
12
13

Sistema Binario (Base 2)

0    // 0
1    // 1
10   // 2
11   // 3
100  // 4
101  // 5
110  // 6
111  // 7
1000 // 8
1001 // 9
1010 // 10
1011 // 11
1100 // 12
1101 // 13

Viendo lado a lado cada sistema, se nota que se comportan exactamente de la misma manera: una vez que se alcanza el último número disponible, se agrega un dígito más a la cifra. Estos espacios o cifras en el sistema binario son conocidos como bits (binary digits) y son simplemente potencias de 2; de la misma manera que los dígitos en el sistema decimal son potencias de 10. Para comprobar esto, demos un vistazo al número 13 en la notación estandar.

Image:32px-Ambox_warning_orange.png

Note

'^' es el símbolo para las potencias y no un operador de bits exclusivo (cubriremos luego este tema)


Sistema Decimal (Base 10)

13
 
// Lo que es igual que
1 * (10^1) + 3 * (10^0)
 
// Lo que es igual que
10 + 3
 
// Lo que es igual que
13

Sistema Binario (Base 2)

1101
 
// Lo que es igual que
1 * (2^3) + 1 * (2^2) + 0 * (2^1) + 1 * (2^0)
 
// Lo que es igual que
8 + 4 + 0 + 1
 
// Lo que es igual que
13

Podemos ver en el ejemplo anterior que si un bit es 0, los podemos ignorar y seguir adelante; después de todo, toda multiplicación por 0 resulta en 0. El ejemplo anterior fue un poco complicado ya que se intentó ser absolutamente claro. Cuando se están convirtiendo binarios lo más importante es colocar las potencia de los bits que están en estado encendido (1).

A continuación, doce potencias de dos:

4096, 2048, 1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 1

Antes de continuar, se debe saber que son potencias. Una potencia es un número multiplicado por si mismo n veces. Con esta información, la lista de números anterior tiene más sentido, excepto por el número 1. Este último número resulta de la potencia 20 que resulta en 1 (todo número elevado al 0 es igual a 1).

2^1 = 2, 2^2 = 4, 2^3 = 8

Se puede ver que mientras se mueve a la derecha, el valor anterior fue multiplicado por dos; así que podemos asumir que si nos movemos a la izquierda nuestro nuevo valor será el número actual dividido entre dos. La división que corresponde a 20 es 2 entre 2, que resulta en 1 (comprobando lo que se dijo anteriormente). Veamos el siguiente ejemplo (algo más complicado).

111011001011111000 // 242424
 
// Recordar ignorar los bits que no están encendidos (los ceros).
 
1 * (2^17) = 131072
 
1 * (2^16) = 65536
 
1 * (2^15) = 32768
 
1 * (2^13) = 8192
 
1 * (2^12) = 4096
 
1 * (2^9) = 512
 
1 * (2^7) = 128
 
1 * (2^6) = 64
 
1 * (2^5) = 32
 
1 * (2^4) = 16
 
1 * (2^3) = 8
 
 
131072 + 65536 + 32768 + 8192 + 4096 +512 + 128 + 64 + 32 + 16 + 8 = 242424

Recordar al convertir: la primera potencia es 0, no cometer el error de poner el décimo octavo lugar como 218. Realmente si hay 18 potencias, pero estas incluyen la potencia de 0, así que 17 será la potencia más alta.

Una vista más detallada de los Bits

La mayoría de los lenguajes de programación permiten diferentes tipos de datos, que varían según la cantidad de bits que utilizan para guardar información; sin embargo, Pawn es un lenguaje con variables sin tipo de 32 bits. Esto significa que Pawn siempre tendrá 32 bits disponibles para guardar información. ¿Qué pasa cuando se tiene mucha información? La respuesta a esa pregunta se puede encontrar en los enteros con signos y sin signos.

Enteros con Signos

¿Has notado alguna vez que cuando un número entero en Pawn es muy grande, se convierte en un número negativo? Esto se debe a que se va por encima del límite de valor en Pawn, el cual es:

2^31 - 1 // Es una potencia. El -1 está porque contamos el 0 (Hay 2147483648 valores incluyendo 0, así que técnicamente 2147483647 es el máximo valor).
 
// Lo que equivale a
2,147,483,647
 
// Lo que equivale a (sistema binario)
 
1111111111111111111111111111111 // 31 bits - todos encendidos

Puede que nos preguntemos por qué ese es el máximo valor, y no 232 - 1 (4294967295). Aquí es donde el signo de los enteros entra en juego. Los enteros con signos tienen la abilidad de guardar valores negativos, mientras los que no tienen signos no pueden. La razón de que el máximo valor del entero no sea 232 -1 es que el bit número 32 es usado para denotar si el número es positivo o negativo (una especie de interruptor). A esto se le llama MSB (Most Significant Bit - El bit más significativo), si el MSB está encendido, el número será negativo; sino está apagado, el número será positivo.

Antes de mostrar algunos valores negativos, se necesita explicar como se representan los números negativos en Pawn. Este usa un sistema llamado 2's complement (complemento de 2) que representa valores negativos, lo que básicamente significa que se le da vuelta a cada bit en el número y se le agrega uno al nuevo número para hacerlo negativo.

Veamos algunos valores negativos:

11111111111111111111111111111111 // Todos los 32 bits encendidos.
 
// Equivale a
 
-1
 
// Y
 
11111111111111111111111111111110
 
// Equivale a
 
-2
 
//Y finalmente
 
10000000000000000000000000000000
 
// Es igual a
 
-2147483648

Como se puede observar, todos los números negativos son simplemente el número positivo original con todos sus bits volteados, incrementado por uno. Esto se ve muy claramente en el último ejemplo, ya que el positivo más alto es 2147483647.

Esto explica porque el rango de valores en los números enteros en Pawn es de hecho:

-2^31 to + 2^31 - 1


Enteros sin Signos

No hay tal cosa como enteros sin signos en Pawn, aunque la única diferencia entre los enteros con signos y sin signos es que los que no tienen signos no pueden guardar valores negativos. Cuando sobrepasan su valor máximo, no se convierten en negativos, varían su valor hasta llegar a 0.

Operadores Binarios

Los operadores binarios permiten manipular individualmente a los bits mediante un patrón. Veamos una lista de operadores disponibles.

Símbolo Nombre
>> y << Desplazamiento aritmético
>>> Desplazamiento lógico
~ NOT (complemento)
& AND
| OR
^ XOR (OR exclusivo)


AND

Image:32px-Ambox_warning_orange.png

Note

No confundir con el operador lógico AND [1]


Un AND binario simplemente toma el AND lógico y lo aplica a cada bit en un número en su forma binaria. Suena un poco confuso, así que es mejor verlo en acción.

1100 // 12
& 
0100 // 4
= 
0100 // 4 ya que ambos poseen "100" en ellos (el cual equivale a 4 en decimal).

Eso fue un poco facil, veamos uno más difícil:

10111000 // 184
& 
01001000 // 72
=
00001000 // 8

Ver el ejemplo debe dar una buena idea de lo que este operador hace. Compara dos tandas de bits, si ambos comparten un bit con 1, el resultado llevará ese mismo bit ENCENDIDO. Si no comparten ningún bit, entonces el resultado es 0.


OR

Image:32px-Ambox_warning_orange.png

Note

no confundir con el operador lógico OR [2]


OR funciona casí igual que AND. La única diferencia es que el OR solo necesita un bit (del par que se está comparando) encendido para que el resultado tenga el mismo bit encendido. Veamos algunos ejemplos.

1100 // 12
|
0100 // 4
=
1100 // 12

Veamos un ejemplo más

10111000 // 184
|
01001000 // 72
=
11111000 // 248

No hace falta explicar esto, si cualquiera de los números tiene un bit encendido, el número resultante tendrá ese mismo bit encendido también.


XOR

Este operador es un poco más parecido a el operador de bits OR, pero tiene una pequeña diferencia. Comparemos los dos operadores a ver si encontramos la diferencia.

1100 // 12
^
0100 // 4
=
1000 // 8

Y finalmente:

10111000 // 184
^
01001000 // 72
=
11110000 // 240

La única diferencia entre XOR y OR es que en XOR, si ambos patrones de bits tienen un mismo bit encendido, entonces el resultado no tendrá ese bit encendido.


NOT

Este operador voltea cada bit en un patrón de bits, cambiando todos los 1's a 0's y vise versa.

~0
=
11111111111111111111111111111111 // -1
 
// Y
 
~100 // 4
=
11111111111111111111111111111011 // -5
 
//and
 
~1111111111111111111111111111111 // 2147483647 (no confundir con -1, que tiene 32 bits, no 31)
=
10000000000000000000000000000000 // -2147483648 (bit número 32 encendido)

Si no entiendes por qué los valores negativos están de alguna forma "alrevez", por favor leer la sección acerca de enteros con signos.


Desplazamiento de Bits

El desplazamiento de bits hace exactamente lo que uno se imagina; desplaza todos los bits de un número hacia cierta dirección. Si recordamos, en un artículo anterior se menciona que Pawn tiene un rango de memoria específico (32 bits que pueden ser usados para almacenamiento). ¿Qué pasa si se desplaza un número fuera de ese rango? La respuesta a esa pregunta depende del operador de desplazamiento que se use, y la dirección en la cual se use.

Image:32px-Ambox_warning_orange.png

Note

En el siguiente ejemplo, todos los números binarios están expresados en todos los 32 bits, para evitar confusiones.


Desplazamiento Aritmético

Desplazamiento a la Derecha

Todos los bits en un número son desplazados n veces a la derecha cuando usamos este operador. Veamos rápidamente un ejemplo simple.

00000000000000000000000000001000  // 8
>>
2
 
=
 
00000000000000000000000000000010 // 2

Se puede ver en el ejemplo anterior que cada bit se ha movido a la derecha dos espacios, y dos ceros fuero agregados a la izquierda como relleno. Estos dos ceros son de hecho los valos de los bits más significativos que son muy importantes cuando se habla de desplazamiento de enteros con signos. La razón de que los MSB son usados como relleno es que así se mantiene el signo del número que está siendo desplazado. Veamos el mismo ejemplo, pero ahora vamos a hacerlo negativo.

11111111111111111111111111111000 // -8
>>
2
 
=
 
11111111111111111111111111111110 // -2

Claramente el comportamiento es el mismo que en el ejemplo previo, exceptos por los bits de la izquierda usados para rellenar, que son UNOS; lo cual prueba que el relleno del desplazamiento aritmético hacia la derecha es el valor del bit más significativo.


Desplazamiento a la Izquierda

Este operador hace exactamente lo contrario al operador aritmético hacia la derecha. Desplaza todos los buts en un número binario hacia la izquierda n veces. Veamos un ejemplo.

00000000000000000000000000001000  // 8
<<
2
 
=
 
00000000000000000000000000100000 // 32

La única diferencia entre los dos operadores aritméticos de desplazamiento (además de la dirección) sería la forma en que se maneja el relleno. Hacia la derecha, el relleno es el valor del bit más significativo, hacia la derecha el relleno es simplemente 0. Esto se debe a que no hay información reelevante (cómo el signo de un número) del cual se deba hacer un seguimiento.

11111111111111111111111111111000 // -8
<<
2
 
=
 
11111111111111111111111111100000 // -32

Incluso cuando el relleno siempre es 0, el signo del número se mantiene. La única cosa de la que hay que preocuparse es de desplazar demasiado. Si se desplaza un número positivo más allá de su máximo valor posible, este se convertirá en un número positivo y vise versa con los números negativos (eventualmente llegará a 0).


Desplazamiento Lógico

Desplazamiento a la Derecha

Esto es lo opuesto al desplazamiento aritmético hacia la izquierda. La mejor forma de describirlo sería una mezcla entre dos desplazamientos aritméticos. Veamos como funciona.

00000000000000000000000000001000  // 8
>>>
2
 
=
 
00000000000000000000000000000010 // 2

Los bits en el número 8 fueron desplazados 2 veces hacia la derecha. ¿Cual es la diferencia con el operador aritmético? La respuesta está en el relleno, en el aritmético el relleno es el valor del bit más significativo. En el lógico el relleno es solo 0. Esto significa que no se mantendrá el signo del número, y el resultado será siempre positivo. Para probar esto, vamos a desplazar un número negativo.

11111111111111111111111111111000 // -8
>>>
2
 
=
 
00111111111111111111111111111110 // 1073741822

Eso prueba que no obtendremos ningún valor negativo mientras usemos el desplazamiento lógico hacia la derecha.


Desplazamiento a la Izquierda

No hay desplazamiento lógico hacia la izquierda, ya que haría exactamente lo mismo que el operador aritmético.



--Kyoshiro 02:06, 9 September 2010 (CEST)

Traducido por Miguel Contreras 22 de Julio de 2013