Преобразование массива десятичных цифр в массив двоичных цифр

голоса
2

Это, вероятно, довольно экзотический вопрос.

Моя проблема заключается в следующем:

TI 83+ графический калькулятор позволяет программировать на нем, используя либо ассамблею и соединительный кабель к компьютеру или его встроенный в TI-BASIC язык программирования.

Согласно тому, что я нашел, он поддерживает только 16-битные целые и некоторые эмулировать поплавки.

Я хочу работать с немного большими числами однако (около 64 бит), поэтому для этого я использую массив с одной цифрой:

{1, 2, 3, 4, 5}

будет десятичной +12345.

В двоичном, это 110000 00111001, или в виде двоичного массива цифр:

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

который был бы как калькулятор отображает его.

Как бы я идти о преобразовании этого массива десятичных цифр (который является слишком большим для калькулятора, чтобы отобразить его в качестве основного языка) в массив десятичных цифр?

Эффективность не является проблемой. Это не домашнее задание.

Это оставило бы меня свободно реализовать Сложение для таких массивов и таких.

благодаря!

Задан 01/11/2009 в 13:10
источник пользователем
На других языках...                            


3 ответов

голоса
0

Основной проблемой здесь является то, что вы собираетесь между основаниями, которые не кратны друг другу, и, таким образом, не существует прямой изолированный отображение между входными и выходными цифрами цифр. Вы, вероятно, придется начать с младшего значащего разряда, выход, как много значащих цифр вывода, как вы можете, прежде чем необходимо обратиться к следующей цифре, и так далее. Таким образом, вам нужно всего лишь иметь не более 2 ваших входных цифр рассматривается в любой данный момент времени.

Вы можете обнаружить, что выгодно с точки зрения порядка обработки, чтобы хранить ваши номера в обратном виде (например, что наименее значащие цифры приходят первые в массиве).

Ответил 01/11/2009 в 13:19
источник пользователем

голоса
1

Мысль об этом, и я думаю, что я хотел бы сделать это с помощью следующего алгоритма «»

  • проверить последнюю цифру (5 в случае примера)
  • если оно нечетно, магазин (от обратной последовательности) 1 в двоичный массив

  • Теперь разделите число на 2 по следующей методике:

  • Начну с первой цифрой и очистить «нести» переменные.
  • разделить его на 2 и добавить «нести» переменные. Если остаток равен 1 (проверить это, прежде чем сделать разрыв с и & 1), а затем поставить 5 в ручной клади
  • повторять до тех пор пока все цифры были сделаны

повторите оба шага снова недо целое число уменьшается до 0-х.

количество в вашем двоичный массив является двоичным представлением

Ваш пример: 1,2,3,4,5

  • 5 нечетное поэтому мы накапливаем 1 в двоичном массиве: 1
  • мы делим массив на 2 с использованием алгоритма:
  • 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

и повторять:

0,6,1,7,2 последняя цифра даже так мы храним 0: 0,1 (уведомление заполняют двоичную строку справа налево)

и т.д

вы в конечном итоге с бинарным

EDIT: Просто чтобы прояснить выше: Все, что я делаю это старый алгоритм возраста:

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

кроме как в вашем примере мы не имеем Int, но массив, который представляет собой (10) базы ИНТ; ^)

Ответил 01/11/2009 в 14:02
источник пользователем

голоса
0

На пути будет преобразовать каждую цифру в десятичном представлении к его двоичное представление, а затем добавить двоичные представления всех цифр:

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

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

Доказательство концепции в C #:

Способы преобразования в массив двоичных цифр, добавление массива и массива умножения на десять:

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;
}

Преобразование массива:

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()
);

Вывод:

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

Редактирование:
Добавлены методы умножения массива на десятки. Intead умножения цифры до его преобразования в двоичный массив, это должно быть сделано в массив.

Ответил 01/11/2009 в 14:23
источник пользователем

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