Převést Array desetinných míst s polem binárních čísel

hlasů
2

Jedná se pravděpodobně o poměrně exotické otázka.

Můj problém je následující:

TI 83+ grafickým kalkulátorem umožňuje naprogramovat na to buď pomocí shromáždění a propojení kabelem k počítači nebo jeho vestavěného TI-BASIC programovacího jazyka.

Podle toho, co jsem našel, že podporuje pouze 16-bitová celá čísla a některé emulované plováky.

Chci pracovat s trochu větším počtem Avšak (asi 64 bit), tak pro které jsem použít pole s jednociferné:

{1, 2, 3, 4, 5}

by Desetinné 12345.

V binární, to je 110000 00111001, nebo jako binární číslice pole:

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

což by bylo, jak ji kalkulátor zobrazí.

Jak bych mohl jít o převodu tohoto pole desetinných míst (což je příliš velký pro kalkulátor zobrazit ji jako mateřský typ) do pole desetinných míst?

Účinnost není problém. Toto není domácí úkol.

To by nech mě zatím realizovat Navíc u těchto polí a podobně.

dík!

Položena 01/11/2009 v 13:10
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
0

Hlavním problémem je, že budete mezi bází, které nejsou násobky navzájem, a tudíž není přímá izolovaná mapování mezi zadávání číslic a výstupních míst. Jste pravděpodobně bude muset začít s nejméně významné číslice, výstupní tolik nejméně významné číslice výstupu jak je to možné dříve, než je nutné konzultovat další číslice, a tak dále. Tak stačí jen mít nanejvýš 2 ze svých vstupních míst posuzována v daném časovém okamžiku.

Dalo by se najít to výhodné z hlediska zpracování Aby bylo možné uchovávat vaše čísla v obrácené formě (tak, že nejméně významné číslice na prvním místě v poli).

Odpovězeno 01/11/2009 v 13:19
zdroj uživatelem

hlasů
1

O tom přemýšlel a myslím, že bych to s tímto ‚algoritmus‘

  • zkontrolovat poslední číslice (5 v příkladném případě)
  • pokud je zvláštní, obchod (od obráceném pořadí) 1 v binárním poli

  • Nyní rozdělit číslo 2 přes následujícím způsobem:

  • začínat s první číslicí a zrušte ‚carry‘ proměnnou.
  • rozdělit jej o 2 a přidat ‚carry‘ proměnnou. V případě, že zbytek je 1 (to zkontrolovat, než vy předěl s a-1), pak dal 5 v přenášení
  • opakovat, dokud nebyly provedeny všechny číslice

zopakování kroků znovu, dokud celá čísla se sníží na 0 to.

číslo v binárním poli je binární reprezentace

Váš příklad: 1,2,3,4,5

  • 5 je lichá, takže uložíme 1 v binárním poli: 1
  • dělíme pole o 2 pomocí algoritmu:
  • 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

a opakuji:

0,6,1,7,2 poslední číslice je dokonce tak jsme uložit 0: 0,1 (všimněte si plníme binární řetězec zprava doleva)

atd

můžete skončit s binární

EDIT: Jen pro objasnění výše: Všechno, co dělám, je prastaré algoritmus:

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

s výjimkou v příkladu nemáme int, ale pole, které představuje základnu (10) int; ^)

Odpovězeno 01/11/2009 v 14:02
zdroj uživatelem

hlasů
0

Na cestě by bylo převést jednotlivé číslice v desítkové reprezentaci na to binární reprezentace a přidejte binární reprezentace všemi číslicemi:

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

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

Proof of concept v C #:

Způsoby pro konverzi na pole binárních číslic, přidání pole a vynásobením pole deseti:

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

Převádění pole:

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

Výstup:

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

Úprava:
přidáno metody pro násobení pole o desítky. Intead vynásobení číslice před převedením na binární pole, musí být provedeno do pole.

Odpovězeno 01/11/2009 v 14:23
zdroj uživatelem

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