Convert Array von Dezimalstellen in ein Array von binären Ziffern

stimmen
2

Dies ist wahrscheinlich eine ziemlich exotische Frage.

Mein Problem ist wie folgt:

Die TI 83+ Grafikrechner können Sie auf ihn programmieren entweder Montag und ein Link-Kabel an einem Computer oder seine eingebauten in TI-BASIC-Programmiersprache.

Nach dem, was ich gefunden habe, es unterstützt nur 16-Bit-Integer und einige emuliert Schwimmer.

Ich möchte jedoch mit etwas größer Zahlen arbeiten (etwa 64 Bit), so dass für I ein Array mit den einstelligen verwenden:

{1, 2, 3, 4, 5}

wäre die Dezimal-12345.

In binär, ist die 110000 00111001 oder als binary digit-Array:

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

was wäre, wie der Rechner es anzeigt.

Wie würde ich mich über dieses Array von Dezimalziffern (die zu groß ist für den Rechner es als native Typen anzuzeigen) in ein Array von Dezimalstellen?

Effizienz ist kein Thema. Dies ist nicht Hausaufgaben.

Dies würde lassen Sie mich frei Zusatz für solche Arrays und so zu implementieren.

Vielen Dank!

Veröffentlicht am 01/11/2009 um 13:10
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
0

Das Hauptproblem dabei ist, dass Sie zwischen den Basen gehen, die nicht Vielfache voneinander sind, und somit gibt es keine direkte isoliert Zuordnung zwischen Eingabeziffern und Ausgabeziffern. Du bist wahrscheinlich mit Ihrer niedrigstwertige Stelle, Ausgabe als viele der am wenigsten signifikante Stellen der Ausgabe beginnen gehen zu müssen, wie Sie können, bevor Sie die nächste Stelle konsultieren müssen, und so weiter. Auf diese Weise müssen Sie nur höchstens 2 Ihre Eingabestellen haben, wird zu einem bestimmten Zeitpunkt untersucht.

Man könnte es von Vorteil in Bezug auf die Verarbeitungsreihenfolge finden Sie Ihre Zahlen in umgekehrter Form zu speichern (so dass die am wenigsten signifikanten Ziffern erste in der Reihe kommen).

Beantwortet am 01/11/2009 um 13:19
quelle vom benutzer

stimmen
1

Dachte darüber nach und ich denke, ich es mit dem folgenden ‚Algorithmus‘ tun würde,

  • überprüfen Sie die letzte Ziffer (5 im Beispielfall)
  • wenn sie ungerade ist, zu speichern (von der umgekehrten Reihenfolge) a 1 in der binären Matrix

  • Nun teilt die Anzahl von 2 durch das folgende Verfahren:

  • beginnen mit der ersten Ziffer und deaktivieren Sie die ‚tragen‘ Variable.
  • teilen sie durch 2 und fügen Sie den ‚carry‘ Variable. Wenn der Rest 1 (dies überprüfen, bevor Sie die Kluft mit einem zu tun und & 1), dann setzte 5 in dem Übertrag
  • wiederholen, bis alle Ziffern geschehen

wiederholen beiden Schritte, bis die ganze Zahl 0 ist reduziert.

die Zahl in Ihrer Binärfeldes ist die binäre Darstellung

Ihr Beispiel: 1,2,3,4,5

  • die 5 ungerade ist, so dass wir Speicher 1 in der binären Matrix: 1
  • Wir teilen das Array von 2 unter Verwendung des Algorithmus:
  • 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

und wiederholen:

0,6,1,7,2 letzte Ziffer ist auch so speichern wir eine 0: 0,1 (Mitteilung wir die binäre Zeichenfolge von rechts nach links zu füllen)

etc

Sie am Ende mit einem binären oben

EDIT: Nur oben zu klären: Alles, was ich tue, ist der Alte alte Algorithmus:

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

außer in Ihrem Beispiel haben wir nicht einen int aber eine Anordnung, die eine (10-Base) int darstellt; ^)

Beantwortet am 01/11/2009 um 14:02
quelle vom benutzer

stimmen
0

Auf Weg wäre jede Ziffer in der Dezimaldarstellung zu konvertieren, um es binäre Darstellung ist und dann die binären Darstellungen aller Ziffern hinzu:

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

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

Proof-of-Concept in C #:

Verfahren zur auf ein Array von Binärziffern umwandelt, Zugabe von Arrays und Multiplizieren eines Array von zehn:

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

Umwandeln eines Arrays:

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

Ausgabe:

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

Edit:
Hinzugefügt Methoden zum Multiplizieren eines Arrays von Zehn. Intead die Ziffer multipliziert , bevor es in ein binäres Array umzuwandeln, hat es auf dem Array durchgeführt werden.

Beantwortet am 01/11/2009 um 14:23
quelle vom benutzer

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