Documente Academic
Documente Profesional
Documente Cultură
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.
Binario (base 2) Octal (base 8) Decimal (base 10) Hexadecimal (base 16)
125 Cambiamos cada dgito octal por su equivalente binario: 001 | 010 | 101 Y despus eliminamos los separadores y los ceros iniciales: 1010101 (binario)
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.
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;
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: )