Convertir una matriz de dígitos decimales en una matriz de dígitos binarios

votos
2

Esta es probablemente una pregunta bastante exótica.

Mi problema es el siguiente:

La calculadora gráfica TI 83+ le permite programar utilizando un ensamblado y un cable de enlace a una computadora o su lenguaje de programación TI-BASIC incorporado.

De acuerdo con lo que he encontrado, solo admite enteros de 16 bits y algunos flotantes emulados.

Sin embargo, quiero trabajar con un número un poco mayor (alrededor de 64 bits), así que para eso utilizo una matriz con un solo dígito:

{1, 2, 3, 4, 5}

sería el Decimal 12345.

En binario, eso es 110000 00111001, o como una matriz de dígitos binarios:

{1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1}

que sería cómo la calculadora lo muestra.

¿Cómo voy a convertir esta matriz de dígitos decimales (que es demasiado grande para que la calculadora la muestre como un tipo nativo) en una matriz de dígitos decimales?

La eficiencia no es un problema. Esto NO es tarea.

Esto me dejaría libre para implementar Addition para tales arreglos y tal.

¡Gracias!

Publicado el 01/11/2009 a las 13:10
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
0

El problema principal aquí es que va entre bases que no son múltiplos entre sí, y por lo tanto no hay un mapeo aislado directo entre dígitos de entrada y dígitos de salida. Probablemente tenga que comenzar con su dígito menos significativo, generar tantos dígitos menos significativos de la salida como sea posible antes de necesitar consultar el siguiente dígito, y así sucesivamente. De esta manera, solo necesita tener como máximo 2 de los dígitos de entrada que se examinan en un momento determinado.

Puede encontrarle ventajoso en términos de orden de procesamiento almacenar sus números en forma inversa (de modo que los dígitos menos significativos sean los primeros en la matriz).

Respondida el 01/11/2009 a las 13:19
fuente por usuario

votos
1

Pensé en ello y creo que lo haría con el siguiente 'algoritmo'

  • verifique el último dígito (5 en el caso de ejemplo)
  • si es impar, almacene (desde el orden inverso) a 1 en la matriz binaria

  • ahora divide el número por 2 a través del siguiente método:

  • comenzar con el primer dígito y borrar la variable 'acarrear'.
  • divídalo por 2 y agregue la variable 'acarrear'. Si el resto es 1 (verifique esto antes de dividir con an y & 1) luego ponga 5 en el acarreo
  • repita hasta que todos los dígitos hayan sido hechos

repita ambos pasos hasta que el número entero se reduzca a 0.

el número en su matriz binaria es la representación binaria

tu ejemplo: 1,2,3,4,5

  • el 5 es impar, así que almacenamos 1 en la matriz binaria: 1
  • Dividimos la matriz por 2 usando el algoritmo:
  • 0,2,3,4,5 => 0,1 + 5,3,4,5 => 0,6,1,4,5 => 0,6,1,2 + 5,5 => 0, 6,1,7,2

y repetir:

0,6,1,7,2 último dígito es par así que almacenamos un 0: 0,1 (observe que llenamos la cadena binaria de derecha a izquierda)

etc

terminas con un binario

EDITAR: Solo para aclarar lo anterior: Todo lo que estoy haciendo es el antiguo algoritmo:

 int value=12345;
 while(value>0)
 {
      binaryArray.push(value&1);
      value>>=1;     //divide by 2
 }

excepto en su ejemplo, no tenemos un int sino una matriz que representa un (10 base) int; ^)

Respondida el 01/11/2009 a las 14:02
fuente por usuario

votos
0

De camino sería convertir cada dígito en la representación decimal a su representación binaria y luego agregar las representaciones binarias de todos los dígitos:

5 = 101
40 = 101000
300 = 100101100
2000 = 11111010000
10000 = 10011100010000

             101
          101000
       100101100
     11111010000
+ 10011100010000
----------------
  11000000111001

Prueba de concepto en C #:

Métodos para convertir a una matriz de dígitos binarios, agregar matrices y multiplicar una matriz por diez:

private static byte[] GetBinary(int value) {
  int bit = 1, len = 1;
  while (bit * 2 < value) {
    bit <<= 1;
    len++;
  }
  byte[] result = new byte[len];
  for (int i = 0; value > 0;i++ ) {
    if (value >= bit) {
      value -= bit;
      result[i] = 1;
    }
    bit >>= 1;
  }
  return result;
}

private static byte[] Add(byte[] a, byte[] b) {
  byte[] result = new byte[Math.Max(a.Length, b.Length) + 1];
  int carry = 0;
  for (int i = 1; i <= result.Length; i++) {
    if (i <= a.Length) carry += a[a.Length - i];
    if (i <= b.Length) carry += b[b.Length - i];
    result[result.Length - i] = (byte)(carry & 1);
    carry >>= 1;
  }
  if (result[0] == 0) {
    byte[] shorter = new byte[result.Length - 1];
    Array.Copy(result, 1, shorter, 0, shorter.Length);
    result = shorter;
  }
  return result;
}

private static byte[] Mul2(byte[] a, int exp) {
  byte[] result = new byte[a.Length + exp];
  Array.Copy(a, result, a.Length);
  return result;
}

private static byte[] Mul10(byte[] a, int exp) {
  for (int i = 0; i < exp; i++) {
    a = Add(Mul2(a, 3), Mul2(a, 1));
  }
  return a;
}

Convirtiendo una matriz:

byte[] digits = { 1, 2, 3, 4, 5 };

byte[][] bin = new byte[digits.Length][];
int exp = 0;
for (int i = digits.Length - 1; i >= 0; i--) {
  bin[i] = Mul10(GetBinary(digits[i]), exp);
  exp++;
}
byte[] result = null;
foreach (byte[] digit in bin) {
  result = result == null ? digit: Add(result, digit);
}

// output array
Console.WriteLine(
  result.Aggregate(
    new StringBuilder(),
    (s, n) => s.Append(s.Length == 0 ? "" : ",").Append(n)
  ).ToString()
);

Salida:

1,1,0,0,0,0,0,0,1,1,1,0,0,1

Editar:
métodos agregados para multiplicar una matriz por decenas. Para multiplicar el dígito antes de convertirlo a una matriz binaria, tiene que hacerse a la matriz.

Respondida el 01/11/2009 a las 14:23
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more