He estado investigando las matemáticas detrás de la conversión de cualquier base a cualquier base. Esto se trata más de confirmar mis resultados que de nada. Encontré lo que parece ser mi respuesta en mathforum.org pero todavía no estoy seguro de tener la respuesta correcta. La conversión de una base más grande a una base más pequeña está bien porque es simplemente tomar el primer dígito multiplicar por la base que desea agregar la repetición del siguiente dígito. Mi problema surge al convertir de una base más pequeña a una más grande. Al hacer esto, hablan sobre cómo necesita convertir la base más grande que desea en la base más pequeña que tiene. Un ejemplo sería pasar de la base 4 a la base 6, necesita convertir el número 6 en la base 4 obteniendo 12. Luego, simplemente hace lo mismo que cuando convertía de grande a pequeño. La dificultad que tengo con esto es que parece que necesitas saber cuál es un número en la otra base. Por lo tanto, habría necesitado saber qué es 6 en la base 4. Esto crea un gran problema en mi mente porque necesitaría una tabla. ¿Alguien sabe una manera de hacer esto de una mejor manera?
Pensé que una conversión de base ayudaría, pero no puedo encontrar ninguna que funcione. Y desde el sitio que encontré parece que te permite convertir de base a base sin pasar por la base 10, pero primero debes saber cómo convertir el primer número de base a base. Eso lo hace un poco inútil.
Los comentaristas dicen que necesito poder convertir una letra en un número. Si es así, ya lo sé. Sin embargo, ese no es mi problema. Mi problema es para convertir una base grande en una base pequeña. Primero necesito convertir el número base que tengo en el número base que quiero. Al hacerlo, rechazo el propósito porque si tengo la capacidad de convertir estas bases a otras bases, ya he resuelto mi problema.
Editar: He descubierto cómo convertir de bases menores o iguales a 10 en otras bases menores o iguales a 10. También puedo pasar de una base mayor que 10 a cualquier base que sea 10 o menor. El problema comienza cuando se convierte de una base mayor que 10 a otra base mayor que 10. O al pasar de una base menor que 10 a una base mayor que 10. No necesito código, solo necesito las matemáticas básicas detrás de él que pueden ser aplicado al código.
string
devuelve unint
), y un algoritmo que toma un número y devuelve su representación en una base dadaRespuestas:
Esto me parece una pregunta muy básica, así que discúlpeme si le doy un poco de clase. El punto más importante que debe aprender aquí es que un número no es su representación de dígitos . Un número es un objeto matemático abstracto, mientras que su representación de dígitos es algo concreto, es decir, una secuencia de símbolos en un papel (o una secuencia de bits en la memoria de cálculo, o una secuencia de sonidos que haces cuando comunicas un número). Lo que te confunde es el hecho de que nunca ves un número, sino siempre su representación en dígitos. Entonces terminas pensando que el número es la representación.
Por lo tanto, la pregunta correcta no es "cómo convertir de una base a otra", sino más bien "cómo averiguo qué número está representado por una cadena de dígitos determinada" y "cómo encuentro la representación de dígitos de un número dado ".
Así que produzcamos dos funciones en Python, una para convertir una representación de dígitos en un número y otra para hacer lo contrario. Nota: cuando ejecutamos la función Python, por supuesto, imprimirá en la pantalla el número que obtuvo en la base 10. Pero esto no significa que la computadora mantenga los números en la base 10 (no lo está). Es irrelevante cómo la computadora representa los números.
Probemos estos:
Armado con funciones de conversión, su problema se resuelve fácilmente:
Una prueba:
Nota: ¡ no pasamos por la representación de base 10! Convertimos la representación de la base al número, y luego el número a la base . El número no estaba en ninguna representación. (En realidad lo fue, la computadora tuvo que representarlo de alguna manera, y lo hizo usando señales eléctricas y cosas funky que ocurren en los chips, pero ciertamente no eran 0 y 1).cb c
fuente
fromDigits
devuelve el número en base 10.Creo que la mejor manera de entender esto es discutiendo con un alienígena (al menos como analogía).
La definición es un número en la base significa que es una cadena de dígitos .x b x <b
Ejemplos La cadena de dígitos 10010011011 es un número en la base 2, la cadena 68416841531 es un número en la base 10, BADCAFE es un número en la base 16.
Ahora supongamos que crecí en el planeta QUUX, donde a todos se les enseña a trabajar en durante toda su vida, y me encuentro con ustedes que están acostumbrados a la base . Entonces me muestras un número y ¿qué hago? Necesito una forma de interpretarlo:q b
Definición Puedo interpretar un número en la base (Nota: es un número en la base ) mediante la siguiente fórmulab b q
donde denota la cadena vacía y denota una cadena que termina en el dígito . Vea mi prueba de que la adición agrega una introducción a esta notación.ϵ s¯d d
Entonces, ¿qué ha pasado aquí? Me has dado un número en la base y lo he interpretado en la base sin ninguna filosofía extraña sobre qué son realmente los números.b q
Clave La clave para esto es que los y I son funciones que operan en números base . Estos son algoritmos simples definidos recursivamente en números base (cadenas de dígitos).× + q q
Esto puede parecer un poco abstracto ya que he estado usando variables en lugar de números reales en todo momento. Supongamos que eres una criatura base 13 (usando los símbolos ) y estoy acostumbrado a la base 7 (que es mucho más sensible) usando símbolos .0123456789XYZ αβγδρζξ
Así que he visto tu alfabeto y lo he tabulado así:
Entonces sé que trabajas en base , y sé a qué número de base 7 corresponde cualquier dígito que escribas.βξ
Ahora, si estuviéramos hablando de física y me estuvieras hablando de constantes fundamentales (por ejemplo) entonces necesito interpretar esto:60Z8
Así que empiezo multiplicando pero esto es algo de la escuela primaria para mí, recuerdo:βζ×βξ
Tabla de multiplicar quux
para encontrar hago:βζ×βξ
así que llegué tan lejos
Ahora necesito realizar la adición usando el algoritmo que se mencionó antes:
asi que
y continuando así obtengo
En resumen: si tengo mi propia concepción del número en términos de cadenas de dígitos de base , entonces tengo forma de interpretar sus números desde la base en mi propio sistema, en función de las operaciones aritméticas fundamentales, que operan de forma nativa en la base .b qq b q
fuente
Esto es solo una refactorización (Python 3) del código de Andrej . En los números de código de Andrej se representan a través de una lista de dígitos (escalares), mientras que en los siguientes números de código se representan a través de una lista de símbolos tomados de una cadena personalizada :
Para realizar una conversión de valor a representación en una base personalizada:
Para realizar una conversión de representación (en una base personalizada) a valor:
Para realizar una conversión de base de una base personalizada a otra:
fuente
La operación fundamental de la conversión de base es la
toDigits()
operación de respuesta @AndrejBauer. Sin embargo, para hacerlo no es necesario crear un número en la representación interna de los números, que es básicamente una conversión desde y hacia la representación de base 2. Puede realizar las operaciones necesarias en la representación base original.Entonces, el primer paso es hacer una operación de división de módulo repetitiva
Como la representación interna son dígitos, uno tiene que hacer una función especificada para probar cero
Eventualmente, uno tiene que hacer la operación modulo_div, que en realidad es la división estándar por base de destino como aprendimos en la escuela.
solo una prueba de verificación para verificar que el código sea correcto:
fuente
Conozco una manera fácil de hacer una conversión base que no requiere un programa de computadora. Es definiendo una forma de convertir de cualquier base a la base 2 y viceversa y luego convirtiendo de una base a otra base, primero convirtiendo de la primera base a la base 2 y luego convirtiendo de la base 2 a la otra base. 2 es tan fácil de multiplicar o dividir en cualquier base.
Para convertir de cualquier base a base 2, todo lo que tiene que hacer es reconocer eso para cualquier número, si toma su notación de base 2 y comienza desde 0 y luego para cada dígito en orden de izquierda a derecha, doble si ese dígito es cero y el doble de sumar 1 si ese dígito es 1, obtienes ese número en sí. Ahora dado ese número en cualquier base, puede dividir por 2 en esa base para obtener un cociente y el resto. Si el resto es 1, el último dígito binario es 1 y si el resto es 0, el último dígito binario es 0. Divida nuevamente entre 2. Si el resto es 1, el segundo último dígito es 1 y si el resto es 0, el segundo último dígito es 0 y así sucesivamente hasta obtener un cociente de 0.
Para convertir de la base 2 a cualquier base, todo lo que tiene que hacer es en esa base, comience desde 0, luego, para cada dígito binario que vaya de izquierda a derecha, doble en esa base si ese dígito es 0 y doble, luego agregue 1 en ese base si ese dígito es 1.
fuente
2 is so easy to multiply or divide by in any base.
No veo eso para bases impares que son más de uno de cualquier poder de dos (11 y 13, para empezar).Puede convertir de base n a base 10 sin ninguna conversión a alguna base intermedia.
Para convertir de base n a base 9, por ejemplo, toma el algoritmo para la conversión a base 10 y reemplaza "10" con "9". Lo mismo para cualquier otra base.
fuente