Conversia Array de zecimale Digits la o serie de binare Digits

voturi
2

Aceasta este, probabil, o întrebare destul de exotice.

Problema mea este după cum urmează:

TI 83+ calculator grafice vă permite să programați pe ea folosind fie de asamblare și un cablu de legătură într-un computer sau built-in TI-BASIC limba de programare.

În conformitate cu ceea ce am găsit, suportă numai 16-Bit Întregi și niște flotoare emulat.

Vreau să lucrez cu un pic număr mai mare cu toate acestea (în jur de 64 de biți), astfel încât pentru că eu folosesc o matrice cu o singură cifră:

{1, 2, 3, 4, 5}

ar fi zecimal 12345.

În binar, e 110000 00111001, sau ca o matrice binar cifre:

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

care ar fi modul în care calculatorul se afișează.

Cum as putea sa merg despre conversia acestui șir de cifre zecimale (care este prea mare pentru calculator pentru a afișa ca un tip nativ) într-o serie de cifre zecimale?

Eficiența nu este o problemă. Acest lucru nu este temele.

Acest lucru ar lăsa-mi liber să pună în aplicare Adaosul pentru astfel de matrice și astfel.

Mulțumiri!

Întrebat 01/11/2009 la 13:10
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
0

Principala problemă aici este că vei între baze care nu sunt multipli de unul față de celălalt, și, astfel, nu există o mapare izolată directă între cifrele de intrare și de ieșire cifre. Tu, probabil, va trebui să înceapă cu cifre dvs. cel mai puțin semnificativ, de ieșire cât mai multe cifre puțin semnificative de ieșire, după cum puteți înainte de a fi necesar să se consulte cifra următoare, și așa mai departe. În acest fel, trebuie doar să aibă cel mult 2 cifre de intrare de a fi examinate la un moment dat în timp.

S-ar putea găsi că este avantajos în ceea ce privește procesarea comenzilor pentru a stoca numerele în formă inversată (astfel încât cele mai mici cifre semnificative sunt pe primul loc în matrice).

Publicat 01/11/2009 la 13:19
sursa de către utilizator

voturi
1

M-am gândit la asta și cred că mi-ar face cu următorul „algoritm“

  • verifica ultima cifră (5 în exemplul caz)
  • dacă este ciudat, magazin (de ordine inversă) 1 în matrice binar

  • acum împărțiți numărul de 2, prin următoarea metodă:

  • începe cu prima cifră și clar variabila „carry“.
  • împărți la 2 și se adaugă variabila „carry“. În cazul în care restul este 1 (verifica acest lucru înainte de a face decalajul cu și & 1), apoi se pune în 5 transporta
  • repeta pana toate cifrele au fost efectuate

repetați ambii pași din nou, pana întregul număr este redus la 0 lui.

numărul în matrice binar este reprezentarea binară

exemplul dumneavoastră: 1,2,3,4,5

  • 5 este ciudat asa ca am stoca 1 în matrice binar: 1
  • vom împărți matrice cu 2 folosind algoritmul:
  • 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

și se repetă:

0,6,1,7,2 ultima cifră este chiar și așa am stoca o 0: 0,1 (Notă completăm șirul binar de la dreapta la stânga)

etc

va termina cu un binar

EDIT: Doar pentru a clarifica mai sus: Tot ce fac este vârsta algoritmul vechi:

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

cu excepția cazului în exemplul dumneavoastră nu avem un int, ci o matrice, care reprezintă o (10 de bază) int; ^)

Publicat 01/11/2009 la 14:02
sursa de către utilizator

voturi
0

La fel ar fi de a converti fiecare cifră în reprezentarea zecimală a este reprezentarea binară și apoi adăugați reprezentările binare ale tuturor cifre:

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

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

Dovada conceptului în C #:

Metodele pentru conversia la o serie de cifre binare, adăugând matrice și multiplicarea unei matrice cu zece:

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

Conversia unei matrice:

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

ieşire:

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

Editare:
Adăugat metode pentru multiplicarea unei matrice cu zeci. Intead multiplicării cifra înainte de conversia acestuia într - o matrice binar, acesta trebuie să fie făcut la matrice.

Publicat 01/11/2009 la 14:23
sursa de către utilizator

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