Antwni Δημοσ. 27 Νοεμβρίου 2012 Δημοσ. 27 Νοεμβρίου 2012 Αν έχουμε ενα δυαδικό αριθμό 11010 που αντιστοιχεί στο 26 δεκαδικο πώς μπορούμε να τον αντιστρέψουμε??Μιλαω πάντα για τον προγραμματισμο c. Πχ διαιρούμε συνέχεια το 26/2 αλλά στο αποτέλεσμα εμφανίζεται το 01011... Καμιά ιδέα??
albNik Δημοσ. 27 Νοεμβρίου 2012 Δημοσ. 27 Νοεμβρίου 2012 Θεωρητικά με το bitwise complement operator "~" ~11010=00101 Αλλά μπαίνουν και διάφορες λεπτομέρειες υλοποίησης
defacer Δημοσ. 27 Νοεμβρίου 2012 Δημοσ. 27 Νοεμβρίου 2012 Τι εννοείς να τον αντιστρέψουμε; Δηλαδή τι αποτέλεσμα περιμένεις στο συγκεκριμένο παράδειγμα; Έχε υπόψη ότι υπάρχουν κι άλλα bits (μηδενικά) εκτός από τα 5 που δείχνεις, επομένως θα πρέπει να μας πεις και αυτά τι περιμένεις να γίνουν. Θεωρητικά με το bitwise complement operator "~" ~11010=00101 Αλλά μπαίνουν και διάφορες λεπτομέρειες υλοποίησης Βιάζεσαι λίγο. Δεν ισχύει αυτό, η ποσότητα σίγουρα δεν είναι μόνο 5 bits.
Antwni Δημοσ. 27 Νοεμβρίου 2012 Μέλος Δημοσ. 27 Νοεμβρίου 2012 Όχι δεν με καταλαβες...δικό μου λάθος Θέλω πχ το 01011 να το γράψω ανάποδα...δηλαδη 11010 Εχω φτιάξει να διαρεί / 2 στο δυαδικό αλλά δεν μπορώ να το εμφανίσω γιατί πρέπει να το αναποδογυρίσω... αλλο παράδειγμα πχ το 55136 να γραφτεί 63155...(άλλο παράδειγμα τελείως αλλά μοιάζει με αυτό που θέλω να κάνω)
defacer Δημοσ. 27 Νοεμβρίου 2012 Δημοσ. 27 Νοεμβρίου 2012 Βασικά πες μας τι θέλεις να πετύχεις εξαρχής και όχι πώς νομίζεις ότι είναι ο σωστός τρόπος να το πετύχεις. Τι παίζει με τη διαίρεση που λες με το 2; Δώσε κώδικα.
migf1 Δημοσ. 27 Νοεμβρίου 2012 Δημοσ. 27 Νοεμβρίου 2012 Καθώς υπολογίζεις τα ψηφία βάζε τα σε έναν πίνακα. Κατόπιν αντέστρεψέ τον. Εναλλακτικά μπορείς να τα αποθηκεύεις απευθείας ανάποδα στον πίνακα (δηλαδή από το τέλος προς την αρχή του) οπότε γλιτώνεις την εκ των υστέρων αντιστροφή του. > char array[MAXDIGITS] = {'\0'}; ... for (int i=MAGDIGITS-1; i > -1 && more_digits && dig = get_next_digit(num); i--) array[i] = dig; i = (i < 0)? i+1 : i; print_array( &array[i], MAXDIGITS-i ); // τσέκαρέ το μόνος σου αυτό, μπορεί να θέλει διόρθωση
albNik Δημοσ. 27 Νοεμβρίου 2012 Δημοσ. 27 Νοεμβρίου 2012 Τι εννοείς να τον αντιστρέψουμε; Δηλαδή τι αποτέλεσμα περιμένεις στο συγκεκριμένο παράδειγμα; Έχε υπόψη ότι υπάρχουν κι άλλα bits (μηδενικά) εκτός από τα 5 που δείχνεις, επομένως θα πρέπει να μας πεις και αυτά τι περιμένεις να γίνουν. Βιάζεσαι λίγο. Δεν ισχύει αυτό, η ποσότητα σίγουρα δεν είναι μόνο 5 bits. E ναι, ήταν λίγο πρόχειρο. Πάντως άλλο ζητάει Μαθηματικά θες το α0*2^0+α1*2^1+α2*2^2+...αν*2^ν να γίνει α0*2^ν+α1*2^(ν-1)+...αν*2^0
Antwni Δημοσ. 27 Νοεμβρίου 2012 Μέλος Δημοσ. 27 Νοεμβρίου 2012 Σωστός ο mig!! Τι μλκας που είμαι...δεν το εβαλα σε πίνακα... Edit:Θα επανέλθω αν δεν τα καταφέρω και θα σας πω Δεν γίνεται με πίνακα γιατί δεν ξέρω το μέγεθος...νομίζω....ε?? Οριστε ενα κομμάτι του κωδικα μου...το χ ειναι η τιμή που δίνει ο χρηστης...επιλογη 1 ειναι το δυαδικο συστημα > if (epilogi==1) { do { y=x%2; x=x/2; printf("\n\nOi times einai: %d\n", y); } while (x=0); } Edit: Βασικά ετσι όπως ειναι μου εμφανίζει μόνο το πρώτο αποτέλεσμα...γιατι??
migf1 Δημοσ. 27 Νοεμβρίου 2012 Δημοσ. 27 Νοεμβρίου 2012 ... Δεν γίνεται με πίνακα γιατί δεν ξέρω το μέγεθος...νομίζω....ε?? Οριστε ενα κομμάτι του κωδικα μου...το χ ειναι η τιμή που δίνει ο χρηστης > if (epilogi==1) { do { y=x%2; x=x/2; printf("\n\nOi times einai: %d\n", y); } while (x=0); } Αν δεν έχεις μέγιστο όριο στο πλήθος των ψηφίων (MAXDIGITS στο παράδειγμα που σου έδωσα), τότε μπλέκεται το πράγμα (ούτε καν bit-array δεν μπορείς να χρησιμοποιήσεις... οπότε διπλά συνδεδεμένη λιστούλα και καλά κουράγια ) Edit: Βασικά ετσι όπως ειναι μου εμφανίζει μόνο το πρώτο αποτέλεσμα...γιατι?? > ... } while (0 == x); Βάζε αριστερά τις σταθερές όταν συγκρίνεις. Αν το είχες εξαρχής... > ... } while (0 = x); θα στο είχε πιάσει ο compiler.
Antwni Δημοσ. 27 Νοεμβρίου 2012 Μέλος Δημοσ. 27 Νοεμβρίου 2012 Σε ευχαριστώ για την απάντησή σου! Όχι δεν έχει περιορισμό η εκφώνηση... Ξέχασα στο while να βάλω το διάφορο ο μλκας για αυτό δεν έτρεχε... Ωραία τώρα τρέχει κανονικά αλλά όπως είπαμε πρέπει να τα αναποδογυρίσω...πώς θα το καταφέρω αυτό??
migf1 Δημοσ. 27 Νοεμβρίου 2012 Δημοσ. 27 Νοεμβρίου 2012 Σου είπα, εφόσον δεν έχεις όριο στο πλήθος των ψηφίων το πρώτο που μου έρχεται στο μυαλό είναι αντί για πίνακα να χρησιμοποιήσεις μια διπλά-συνδεδεμένη λίστα. Στην εκτύπωση θα την τυπώσεις από πίσω προς τα εμπρός. Ψέμματα, με στοίβα (stack) είναι πιο εύκολο. Push σε κάθε iteration, συνεχόμενα Pop στην εκτύπωση.
Antwni Δημοσ. 27 Νοεμβρίου 2012 Μέλος Δημοσ. 27 Νοεμβρίου 2012 Edit:Βασικά δεν καταλαβα τι περιορισμό εννοείς??μπορεί να κάνω και λάθος...αλλά πρέπει να κάνω το αντίστοιχο σε οκταδικο και σε 16δικο Στην εκτύπωση θα την τυπώσεις από πίσω προς τα εμπρός. Πώς θα το κάνω αυτό?? Ψέμματα, με στοίβα (stack) είναι πιο εύκολο. Push σε κάθε iteration, συνεχόμενα Pop στην εκτύπωση. Στοιβα δεν έχουμε κάνει αλλά δεν θέλει πίνακα και αυτό?
migf1 Δημοσ. 27 Νοεμβρίου 2012 Δημοσ. 27 Νοεμβρίου 2012 Edit:Βασικά δεν καταλαβα τι περιορισμό εννοείς??μπορεί να κάνω και λάθος...αλλά πρέπει να κάνω το αντίστοιχο σε οκταδικο και σε 16δικο Μάλλον είστε ακόμα σε αρχικό στάδιο, ε; Νόμιζα πως είχατε προχωρήσει πιο πολύ στην ύλη. Λίστες, στοίβες, ουρές κλπ έχετε κάνει; Αν ναι, κάντο με στοίβα. Αν όχι κάντο με MAGDIGITS = 64 πίνακα και βάλε σημείωση από κάτω "για νούμερα μεγαλύτερα από UINT64_MAX θα χρησιμοποιήσουμε μια έτοιμη big-integer library".
Antwni Δημοσ. 27 Νοεμβρίου 2012 Μέλος Δημοσ. 27 Νοεμβρίου 2012 Να φτιάξω πίνακα 64αρι δηλαδη ε? Οκ σε ευχαριστώ... Αν κολλησω καπου αλλου ενημερώνω
migf1 Δημοσ. 27 Νοεμβρίου 2012 Δημοσ. 27 Νοεμβρίου 2012 Στοιβα δεν έχουμε κάνει αλλά δεν θέλει πίνακα και αυτό? Πίνακας συνήθως σημαίνει με γνωστό μέγιστο μήκος. Αν είναι να τον κάνεις με δυναμικά μεταβαλλόμενο μήκος, τότε είναι πολύ πιο απλό ο κώδικας υλοποίησης της στοίβας να γίνει με δείκτες (απλά-συνδεδεμένη λίστα είναι επί της ουσίας η στοίβα).
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα