Μετατρέψτε Array των δεκαδικών ψηφίων σε μια σειρά από δυαδικά ψηφία

ψήφοι
2

Αυτό είναι ίσως ένα πολύ εξωτικό θέμα.

Το πρόβλημα μου είναι η εξής:

Η TI 83+ γραφικά υπολογιστή σας επιτρέπει να προγραμματίσετε σε αυτό χρησιμοποιώντας είτε Συνέλευση και ένα καλώδιο σύνδεσης με υπολογιστή ή ενσωματωμένο TI-BASIC γλώσσα προγραμματισμού του.

Σύμφωνα με ό, τι έχω διαπιστώσει, ότι υποστηρίζει μόνο 16-Bit ακέραιοι και μερικά παράδειγμα προς μίμηση και άρματα.

Θέλω να συνεργαστεί με λίγο μεγαλύτερο αριθμούς όμως (περίπου 64 bit), έτσι για να μπορώ να χρησιμοποιήσετε μια σειρά με τα μονοψήφια:

{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 βάση) int? ^)

Απαντήθηκε 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