Sunteți pe pagina 1din 5

Sistemas de numeracin

Generalidades:
En programacin es frecuente acudir a diferentes sistemas de numeracin segn las circunstancias. Hay que tener en cuenta que el hombre usa el sistema decimal, (segn una opinin bastante general debido a una circunstancia ms o menos afortunada: por la simple razn de que tiene diez dedos entre las dos manos. A menudo se usa el cinco como base de numeracin auxiliar). La palabra dgito y dedo tienen la misma raiz latina, por eso usamos una numeracin con 10 dgitos o dedos. Hubiera sido mucho ms prctico usar un sistema de numeracin basado en un nmero con ms factores, como el 12 (3*2*2) o mejor todava el 8 (2*2*2) o el 16 (2*2*2*2). Pero por suerte o por desgracia: 1. Los humanos tenemos diez dedos y 2. Los humanos contamos con los dedos (al menos al principio), porque estn muy a mano. Para contar de 1 a 10 es fcil, pero qu pasa cuando hay que contar ms de diez cosas?. Pues usamos las manos de un "amigo" para contar cuantas veces hemos usado los dedos de las nuestras, as "12", sera dos ms una vez diez. Otra circunstancia curiosa es que en el sistema de numeracin que usamos los nmeros se leen y escriben de derecha a izquierda, al revs del modo en que escribimos las palabras. Cuando interpretamos nmeros de varias cifras, hay que empezar por la derecha, el primer dgito son unidades, el siguiente decenas, es decir cuantos grupos de 10 elementos estamos contando. El siguiente centenas, es decir el nmero de grupos de 10 elementos de grupos de 10 elementos, o sea el nmero de grupos de 100 elementos. Y as sucesivamente. Si quieres saber ms detalles sobre la historia de los sistemas de numeracin, consulta este enlace.

Sistemas de numeracin en la programacin


En C y C++ se usan bsicamente cuatro sistemas de numeracin:

Binario (base 2) Octal (base 8) Decimal (base 10) Hexadecimal (base 16)

Sistema binario, numeracin en base 2


El sistema binario es el que usan los ordenadores, que es como si slo tuvieran un dedo, su unidad bsica de memoria, el bit, slo puede tomar dos valores, inactivo o activo, y se codifican como 0 y 1, respectivamente. Los ordenadores se quedan sin dedos enseguida, en cuanto tienen que contar ms de uno, as que aaden ms dgitos. Por ejemplo, veamos el nmero binario 10110. Estamos en base 2, as que el nmero se calcula as: 0 * 2^0 + 1 * 2^1 + 1 * 2^2 + 0 * 2^3 + 1 * 2^4 = 2 + 4 + 16 = 22 (decimal) Este tipo de numeracin resulta muy til cuando cada bit puede significar cosas diferentes para un ordenador.

Sistema octal, numeracin en base 8


El sistema octal usa ocho dgitos: 0, 1, 2, 3, 4, 5, 6 y 7. Este es el sistema de numeracin que usaramos si tuviramos manos de cuatro dedos, como los Simpsons :-) Por ejemplo, un nmero en octal sera 125. Estamos en base 8,as que el nmero se traduce a decimal as: 5 * 8^0 + 2 * 8^1 + 1 * 8^2 = 5 + 2 * 8 + 64 = 85 (decimal) Desconozco el origen histrico de por qu de usa este sistema de numeracin en ordenadores. Pero la explicacin prctica es que la conversin entre binario y octal es casi directa. Por ejemplo tenemos el nmero binario 10010010001000101101001. Para convertirlo a octal agrupamos los dgitos de tres en tres empezando por la derecha, y rellenamos con ceros a la izquierda hasta tener slo grupos de tres bits o dgitos: 010 | 010 | 010 | 001 | 000 | 101 | 101 | 001 A cada grupo de tres bits le podemos hacer corresponder un dgito octal, al 000 el 0, al 001 el 1, al 010 el 2, ... al 111 el 7. As que podemos traducir directamente el nmero anterior a octal: 22210551 (octal) La conversin inversa, de octal a binario es igual de simple. Por ejemplo el nmero octal:

125 Cambiamos cada dgito octal por su equivalente binario: 001 | 010 | 101 Y despus eliminamos los separadores y los ceros iniciales: 1010101 (binario)

Sistema decimal, numeracin en base 10


En programacin se usa el decimal porque es el que usamos los humanos, y al fin y al cabo, el ordenador est a su servicio. Es sistema decimal usa diez dgitos para expresar los nmeros, 0, 1, 2, 3, 4, 5, 6, 7, 8 y 9. Por ejemplo para el nmero decimal 42335: 5 * 10^0 + 3 * 10^1 + 3 * 10^2 + 2 * 10^3 + 4 * 10^4 = 5 + 30 + 300 + 2000 + 40000

Sistema hexadecimal, numeracin en base 16


El sistema hexadecimal, que es el rey de los sistemas de numeracin, al menos en lo que respecta a los ordenadores. Usa 16 dgitos, los archiconocidos 0 a 9 y para los otros seis se usan las letras A, B, C, D, E y F, que tienen valores 10, 11, 12, 13, 14 y 15, respectivamente. Se usan indistintamente maysculas y minsculas. Por ejemplo, un nmero hexadecimal 4F3D: 13 * 16^0 + 3 * 16^1 + 15 * 16^2 + 4 * 16^3 = 13 + 3 * 16+ 15 * 256 + 4 * 4096 = 20285 Este sistema de numeracin tiene muchas ventajas:

La conversin entre binario y hexadecimal es tan simple como en octal, la nica diferencia es que los bits se agrupan de cuatro en cuatro. 0000 es 0, 0001 es 1, 0010 es 2 ... 1111 es F. El byte, es la unidad de memoria ms usada por los ordenadores y agrupa ocho bits. Para codificar un nmero de 8 bits slo se necesitan dos dgitos hexadecimales. El mayor nmero expresable por un byte, 11111111(binario), equivale a 255(decimal) y a FF(hexadecimal). Y para palabras de dos bytes (16 bits), se usan slo cuatro dgitos hexadecimales. (El nmero 16 aparece mucho cuando se habla de ordenadores.) Para 32 bits: 8 dgitos hexadecimales, y sucesivamente.

Con la prctica podrs hacer conversiones de hexadecimal a binario de memoria: 3E equivale a 00111110 AA equivale a 10101010

Generalizando
Un nmero en base n slo puede estar formado por dgitos entre 0 y n-1, por ejemplo, en base 2 slo se admiten los dgitos 0 y 1; en base 8, los dgitos 0 a 7; en base 10, los dgitos 0 a 9. As, por ejemplo, en base 2 el nmero 2 se expresa como 10, en base 8 u octal, el nmero 8 se expresa como 10,en base 10 o decimal el nmero 10 se expresa como 10 y en base 16 o hexadecimal, el nmero 16 se expresa como 10.. As que en general, el valor de un nmero expresado en base n ser: Nmero en base 'n': "abcde" Valor: e*n^0 + d*n^1 + c*n^2 + b * n^3 + a*n^4 Donde "n^x" se lee como n elevado a la x potencia.

Algoritmo para conversin de bases


Ahora veamos el algoritmo para hacer un conversor universal. Supongamos que el nmero est en un array que se llama "Numero":
char Numero[] = "56652";

1. Lo primero, en un programa bien hecho, habra que comprobar que el nmero cumple las reglas, es decir, que no hay dgitos prohibidos en el sistema de numeracin que usamos. 2. Necesitamos el nmero de dgitos:
int NDigitos = strlen(Numero); int Base = 8; /* Para base 8, ser 16 para hexadecimal y 2 para binario */

3. Empezaremos a recorrer el nmero desde el final, as que el primer exponente ser 0, cualquier nmero elevado a 0 es 1. En lugar de calcular n^DigitoNo, calcularemos el multiplicador, que se puede obtener multiplicando la base por el multiplicador anterior. Por ejemplo, para base 10 la secuencia de multiplicadores es 1, 10, 100, 1000, 10000, etc, para base 8 es 1, 8, 64, 512, etc
int Multiplicador=1;

int DigitoNo = NDigitos-1; /* Los arreglos tienen ndices empezando por el 0 */ Valor = 0;

4. Recorremos el nmero desde el final: Numero[DigitoNo]


while(DigitoNo >= 0) { Valor += ValorDigito(Numero[DigitoNo])*Multiplicador; Multiplicador *= Base; DigitoNo--; }

5. El resultado ser Valor. Adems, necesitamos una funcin que calcule el valor de un dgito en formato ASCII y lo convierta a int. Para que sirva para el sistema hexadecimal debe entender los caracteres '0' a '9', 'a' a 'f' y 'A' a 'F'.
int ValorDigito(char d) { if(d >= '0' && d <= '9') return d-'0'; if(d >= 'a' && d <= 'f') return 10+d-'a'; if(d >= 'A' && d <= 'F') return 10+d-'A'; return -1; /* Carcter prohibido */ }

Eso es todo.

Programa en C
El conversor "convert.cpp" (1726 bytes): (Alternativo: )

Diciembre de 2.000, C con Clase, webmaster@conclase.net

S-ar putea să vă placă și