Konverter Array desimaler til en rekke binære siffer

stemmer
2

Dette er trolig en ganske eksotisk spørsmålet.

Problemet mitt er som følger:

TI 83+ grafisk kalkulator kan du programmere på den ved hjelp av enten forsamlingen og en link-kabel til en datamaskin eller den innebygde TI-BASIC programmeringsspråk.

Etter hva jeg har funnet, støtter det bare 16-bits heltall og noen emulert flyter.

Jeg ønsker å arbeide med en litt større tall men (rundt 64 bit), så for at jeg benytte en matrise med samme sifre:

{1, 2, 3, 4, 5}

ville være desimal 12345.

I binære, det er 110000 00111001, eller som et binært tall matrise:

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

som ville være hvordan kalkulatoren viser den.

Hvordan skulle jeg gå om å konvertere denne matrisen desimaler (som er for stor for at kalkulatoren skal vise det som en innfødt type) i en rekke desimaler?

Effektivitet er ikke et problem. Dette er ikke lekser.

Dette ville forlate meg fri til å implementere Tillegg for slike arrays og slikt.

Takk!

Publisert på 01/11/2009 klokken 12:10
kilden bruker
På andre språk...                            


3 svar

stemmer
0

Det viktigste problemet her er at du kommer mellom baser som ikke er multipler av hverandre, og dermed er det ikke en direkte isolert mapping mellom inn tall og utgangs sifre. Du er sannsynligvis nødt til å starte med minst signifikante siffer, utgang så mange minst signifikante sifrene i produksjonen som du kan før du trenger å konsultere neste siffer, og så videre. På den måten trenger du bare å ha på de fleste to av dine innspill sifre blir undersøkt på et gitt tidspunkt.

Du kan finne det fordelaktig med tanke på behandling for å lagre numre i vendt form (slik at de minst signifikante sifre komme først i rekken).

Svarte 01/11/2009 kl. 12:19
kilden bruker

stemmer
1

Tenkte på det, og jeg tror jeg ville gjøre det med følgende 'algoritme'

  • Sjekk siste siffer (fem i eksempelet tilfellet)
  • hvis det er et oddetall, lagre (fra motsatt rekkefølge) et 1 i binær matrise

  • nå dele antall av to ved hjelp av følgende metode:

  • begynne med det første sifferet og fjerne 'bære' variabel.
  • dele det med 2 og legge til 'bærer' variabel. Hvis resten er en (sjekk dette før du gjør skillet med en og & 1) og deretter sette fem i bære
  • gjenta inntil alle sifrene er blitt gjort

gjenta begge trinnene igjen før hele nummeret er redusert til 0-tallet.

nummeret i binær matrise er den binære representasjonen

ditt eksempel: 1,2,3,4,5

  • 5 er et oddetall, så vi lagre en i binær matrise: 1
  • vi deler matrisen ved 2 anvendelse av algoritmen:
  • 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

og gjentar:

0,6,1,7,2 siste sifferet er enda så vi lagre en 0: 0,1 (varsel vi fylle den binære strengen fra høyre mot venstre)

etc

du ende opp med en binær

EDIT: Bare for å klargjøre ovenfor: Alt jeg gjør er år gamle algoritme:

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

bortsett fra i eksempel at vi ikke har en int, men en matrise som representerer en (10 base) int; ^)

Svarte 01/11/2009 kl. 13:02
kilden bruker

stemmer
0

På måten ville være å konvertere hvert siffer i desimal representasjon til det binære representasjon og deretter legge de binære representasjoner av alle sifrene:

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

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

Proof of concept i C #:

Metoder for omdannelse til en rekke binærsifre, tilsetning av matriser og multiplisere en oppstilling av ti:

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

Konvertering en matrise:

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

Produksjon:

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

Edit:
lagt fremgangsmåter for å multiplisere en matrise av tiere. Intead av multiplisere sifret før du konverterer den til en binær matrise, må det gjøres for å matrisen.

Svarte 01/11/2009 kl. 13:23
kilden bruker

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