Προς το περιεχόμενο

Python μετατροπή αρνητικών.


taslikos

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Τελικά σωστά το είχες το αποτέλεσμα, απλά εγώ brainfart διαβάζοντας την περιγραφή και νόμιζα πως ήταν λάθος. Λοιπόν για two's complement υπάρχουν διάφοροι τρόποι να φτάσεις στο αποτέλεσμα, π.χ. είσοδος = 6 (110).

 

1. Παίρνεις το one's complement (αντιστρέφεις τα πάντα) και μετά προσθέτεις 1. 0110 => 1001 => 1010. Το επιπλέον 0 μπροστά από το αρχικό 110 είναι σημαντικό, αντιπροσωπεύει το πρόσημο + που μετά γίνεται -.

 

2. Αφαιρείς την είσοδο από την αμέσως επόμενη μεγαλύτερη δύναμη του 2 ανάλογα με το πόσα bits θέλεις. 110 => 10000 - 110 => 1010. 10000 επειδή χρειαζόμαστε 4 bits για το -6 άρα η μεγαλύτερη δύναμη του 2 είναι 2^5.

 

Αυτό που λες εσύ, αν το πάρεις από αριστερά προς τα δεξιά, είναι στην ουσία μπακαλιά για να κάνεις το πρώτο που λέω παραπάνω.

 

 

Οι μπακαλιές καλές για να βγάζεις αποτέλεσμα, αλλά άμα δεν ξέρεις γιατί τις κάνεις έχεις θέματα.

Σε ευχαριστω. Εχεις ιδέα πως μπορω να μεταφράσω αυτήν την μέθοδο σε κώδικα?

 

Επισης στον 1ο τροπο σου 1001+1 κανει 1002 πως προκύπτει το 1010 (ειμαι εντελώς αρχάριος)

Το +1 δεν παει στο λιγότερο σημαντικό ψηφίο?

Επεξ/σία από taslikos
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Λοιπον παιδες το καλο ειναι πως με τα πολλα κατασκευασα τον κωδικα που ηθελα οποτε ειμαι κομπλε.. το προβλημα ειναι πως δεν καταλαβα πως το εκανα σε ενα κομματι διοτι το βρηκα ετοιμο σε ενα σιτε θα ηθελα καποιος να εξηγησει τον εξης κωδικα που βρηκα.

 

https://michaelwhatcott.com/a-few-bits-of-python/

 

if number < 0:
return compliment(bin(abs(number) - 1)[2:]).rjust(size_in_bits, '1')
else:
return bin(number)[2:].rjust(size_in_bits, '0')


def compliment(value):
return ''.join(COMPLEMENT[x] for x in value)


COMPLEMENT = {'1': '0', '0': '1'}

 

δεν καταλαβαινω το compliment.. λεει ειναι συναρτιση που αντιστρεφει ολα τα ψηφια αλλα μπορει κανεις να εξηγησει το σκεπτικο της?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Σου στέλνω και γώ μια άλλη συνάρτηση πιο απλή

Το πρώτο πρόβλημα είναι να βρείς το τελευταίο 1 του αριθμού σου έστω bn

αυτό γίνεται εύκολα αν αντιστρέψεις τον bn και βρεις το πρώτο 1

μετά στο κομμάτι εώς το 1 που βρήκες αντιστρέφεις τα 0 με 1 και 1 με 0

και προσθέτεις τέλος το τμήμα από το 1 εώς το τέλος

def negative_binary(num):
    bn=bin(num)
    bn=bn.lstrip('-0b')
    
    n_b_l=list(bn)
    n_b_l.reverse()
    first_1=n_b_l.index('1')
    first_1=-1-first_1 #εδώ παίρνεις το δείκτη του τελευταίου 1 του αριθμού σου.
    neg_bn=''       
    for i in bn[:first_1]: #εδώ αλλάζεις τα 0 με 1 και 1 με 0
      if i=='0':
        neg_bn+='1'
      else:
        neg_bn+='0'
    neg_bn=neg_bn+bn[first_1:]#εδώ προσθέτεις το κομμάτι μετά το τελευταίο 1
    return neg_bn

Ο κώδικας που βρήκες είναι σίγουρα ποιό προχωρημένος αλλά αρκέτα πιο περίπλοκος για ένα αρχάριο

Ο κώδικας επίσης που βρήκες παίρνει ως αριθμό δεκαδικό και όχι δυαδικό ενώ ο δικός μου δυαδικό ως str


 

 

Ωπς δεν πρόσεξα ότι θές να μετατρέπει δεκαδικό  το διορθώνω

τώρα είναι πιστεύω εντάξει.

Επεξ/σία από k33theod
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Λοιπον παιδες το καλο ειναι πως με τα πολλα κατασκευασα τον κωδικα που ηθελα οποτε ειμαι κομπλε.. το προβλημα ειναι πως δεν καταλαβα πως το εκανα σε ενα κομματι διοτι το βρηκα ετοιμο σε ενα σιτε θα ηθελα καποιος να εξηγησει τον εξης κωδικα που βρηκα.

 

https://michaelwhatcott.com/a-few-bits-of-python/

 

if number < 0:

return compliment(bin(abs(number) - 1)[2:]).rjust(size_in_bits, '1')

else:

return bin(number)[2:].rjust(size_in_bits, '0')

 

 

def compliment(value):

return ''.join(COMPLEMENT[x] for x in value)

 

 

COMPLEMENT = {'1': '0', '0': '1'}

 

δεν καταλαβαινω το compliment.. λεει ειναι συναρτιση που αντιστρεφει ολα τα ψηφια αλλα μπορει κανεις να εξηγησει το σκεπτικο της?

 

Αυτός χρησιμοποιεί κάποιον διαφορετικό αλγόριθμο που βρίσκει τον αρνητικό αντιστρέφοντας όλα τα στοιχεία και μετά προσθέτοντας 1

και το κάνει ως εξής:

αντί να βρεί τον δυαδικό του 15πχ  (για το -15) να κρατήσει τα στοιχεία από δεξιά ως το 1ο '1' και να αντιστρέψει τα υπόλοιπα

βρίσκει τον δυαδικό του (15-1) δηλαδή 14 και μετά τα αντιστέφει όλα (λιγότερη δουλεία από αυτή που έκανα εγώ)

 

η δική μου συνάρτηση με τον δικό του αλγόριθμο

def negative_binary(num):
    bn=bin(num+1)
    bn=bn.lstrip('-0b')
    neg_bn=''       
    for i in bn:
      if i=='0':
        neg_bn+='1'
      else:
        neg_bn+='0'
    return neg_bn

το join που χρησιμοποιεί στην compliment είναι μέθοδος για str και την τρέχει σε όλα τα στοιχεία του bin(14) για να τα αλλάξει από 0 σε 1 και 1 σε 0

str.join(iterable)

 

Return a string which is the concatenation of the strings in the iterable iterable. A TypeError will be raised if there are any non-string values in iterable, including bytes objects. The separator between elements is the string providing this method

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Σου στέλνω και γώ μια άλλη συνάρτηση πιο απλή

Το πρώτο πρόβλημα είναι να βρείς το τελευταίο 1 του αριθμού σου έστω bn

αυτό γίνεται εύκολα αν αντιστρέψεις τον bn και βρεις το πρώτο 1

μετά στο κομμάτι εώς το 1 που βρήκες αντιστρέφεις τα 0 με 1 και 1 με 0

και προσθέτεις τέλος το τμήμα από το 1 εώς το τέλος

def negative_binary(num):
    bn=bin(num)
    bn=bn.lstrip('-0b')
    
    n_b_l=list(bn)
    n_b_l.reverse()
    first_1=n_b_l.index('1')
    first_1=-1-first_1 #εδώ παίρνεις το δείκτη του τελευταίου 1 του αριθμού σου.
    neg_bn=''       
    for i in bn[:first_1]: #εδώ αλλάζεις τα 0 με 1 και 1 με 0
      if i=='0':
        neg_bn+='1'
      else:
        neg_bn+='0'
    neg_bn=neg_bn+bn[first_1:]#εδώ προσθέτεις το κομμάτι μετά το τελευταίο 1
    return neg_bn
Ο κώδικας που βρήκες είναι σίγουρα ποιό προχωρημένος αλλά αρκέτα πιο περίπλοκος για ένα αρχάριο

Ο κώδικας επίσης που βρήκες παίρνει ως αριθμό δεκαδικό και όχι δυαδικό ενώ ο δικός μου δυαδικό ως str

 

Ωπς δεν πρόσεξα ότι θές να μετατρέπει δεκαδικό το διορθώνω

τώρα είναι πιστεύω εντάξει.

Πολύ καλή αντιμετώπιση!

 

Ωστόσο έχω κάποιες απορριες μιας και δεν έχω δει ξανά κάποιες από τις εντολές σου.

 

σε κάποια σημεία το += είναι το ίδιο με το = ή το == η έχει άλλη ιδιότητα;

Επεξ/σία από taslikos
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Πολύ καλή αντιμετώπιση!

 

Ωστόσο έχω κάποιες απορριες μιας και δεν έχω δει ξανά κάποιες από τις εντολές σου.

 

σε κάποια σημεία το += είναι το ίδιο με το = ή το == η έχει άλλη ιδιότητα;

Δεν έχει και πολύ νόημα να σου τα εξηγήσει κάποιος γιατί είναι πολύ βασικά πράγματα και καλύτερα να τα διαβάσεις από κάποιο βιβλίο ή κάποια καλή ιστοσελίδα https://docs.python.org/3/tutorial/introduction.html#numbers

εάν τα διαβάσεις και δεν καταλάβεις κάτι ρώτα. https://www.tutorialspoint.com/python/python_basic_operators.htm

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

μια ακομη ερωτηση(σορρυ σας τρελανα):

 

εστω οτι εχω a ενα string και θελω να αντιστρεψω καθε ασσο με 0 και το αντιστροφο.

 

εφτιαξα το συγκεκριμενο προγραμμα αλλα για καποιον λογο το string δεν ατιστρεφεται αλλα παραμενει ιδιο μπορει καποιος να βοηθησει?

a="10001001"

for i in range(0,len(a)): # εβαλα το len διοτι αργοτερα θα το κανω σε γενικη μορφη.
    if a[i]==0:    # αν πχ το α[1]==0 τοτε να το αλλαξει σε 1
        a[i]==1
    else: a[i]==0    # ακριβως το αντιθετο

print(a)
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

 

μια ακομη ερωτηση(σορρυ σας τρελανα):

 

εστω οτι εχω a ενα string και θελω να αντιστρεψω καθε ασσο με 0 και το αντιστροφο.

 

εφτιαξα το συγκεκριμενο προγραμμα αλλα για καποιον λογο το string δεν ατιστρεφεται αλλα παραμενει ιδιο μπορει καποιος να βοηθησει?

a="10001001"

for i in range(0,len(a)): # εβαλα το len διοτι αργοτερα θα το κανω σε γενικη μορφη.
    if a[i]==0:    # αν πχ το α[1]==0 τοτε να το αλλαξει σε 1
        a[i]==1
    else: a[i]==0    # ακριβως το αντιθετο

print(a)

 

Τα strings στην Python είναι immutable.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

 

μια ακομη ερωτηση(σορρυ σας τρελανα):

 

εστω οτι εχω a ενα string και θελω να αντιστρεψω καθε ασσο με 0 και το αντιστροφο.

 

εφτιαξα το συγκεκριμενο προγραμμα αλλα για καποιον λογο το string δεν ατιστρεφεται αλλα παραμενει ιδιο μπορει καποιος να βοηθησει?

a="10001001"

for i in range(0,len(a)): # εβαλα το len διοτι αργοτερα θα το κανω σε γενικη μορφη.
    if a[i]==0:    # αν πχ το α[1]==0 τοτε να το αλλαξει σε 1
        a[i]==1
    else: a[i]==0    # ακριβως το αντιθετο

print(a)

Επίσης δεν σου δίνει σφάλμα γιατί χρησιμοποιείς λάθος όλους τους τελεστές με αποτέλεσμα να μην έχεις αναφορά σφάλματος

όταν διαβάζεις με τη for string τα στοιχεία είναι str με μήκος 1 πρέπει δηλαδή να γράψεις if a=='0'  και όχι a==0

στην ανάθεση το ίδιο a='1' με μονό =

για να πάρεις το σωστό error

TypeError: 'str' object does not support item assignment

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Σε ευχαριστω. Εχεις ιδέα πως μπορω να μεταφράσω αυτήν την μέθοδο σε κώδικα?

Επισης στον 1ο τροπο σου 1001+1 κανει 1002 πως προκύπτει το 1010 (ειμαι εντελώς αρχάριος)

Είναι δυαδική πρόσθεση, όχι δεκαδική.

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Επίσης δεν σου δίνει σφάλμα γιατί χρησιμοποιείς λάθος όλους τους τελεστές με αποτέλεσμα να μην έχεις αναφορά σφάλματος

όταν διαβάζεις με τη for string τα στοιχεία είναι str με μήκος 1 πρέπει δηλαδή να γράψεις if a=='0'  και όχι a==0

στην ανάθεση το ίδιο a='1' με μονό =

για να πάρεις το σωστό error

TypeError: 'str' object does not support item assignment

εκανα τις αλλαγες που μου λες και πλεον μου βγαζει το λαθος που ανεφερες. με ενα ψαξιμο νομιζω πως καταλαβα πως δεν μπορω να πειραξω το υπαρχον string και πρεπει να το βαλω σε ενα νεο.. ο κωδικας εχει ως εξης πλεον:

a=input()
while a!="end":
    a=int(a)
    if a<0:
        a=abs(a)
        a=bin(a)[2:]
        a="".join(('0',a))
        a[::-1]
        b=a.index("1")
        for i in range(b+1,len(a)):
            if a[i]=="0":    # αν πχ το α[1]==0 τοτε να το αλλαξει σε 1
                a[i]="1"
            if a[i]=="1":
                a[i]='0'    
        a[::-1]
        print(a)
        a=input()
    if a>0:
        a=bin(a)[2:]
        print(a)
        a=input()

εχω θεμα στο κομματι με το i.

πως μπορω να φτιαξω νεο string με τις αλλαγες που θελω να κανω στο παλιο (a)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αν δείς παραπάνω υπάρχουν ήδη δύο τρόποι

neg_bn=''       
for i in bn:
  if i=='0':
    neg_bn+='1'
  else:
    neg_bn+='0'

και 

COMPLEMENT = {'1': '0', '0': '1'}
neg_bn=''
neg_bn=neg_bn.join(COMPLEMENT[x] for x in bn)

όπου bn o αρχικός σου δυαδικός και neg_bn ο καινούργιος

 

έχεις όμως και πολλά άλλα λάθη με 1ο και βασικό βάζε τον κώδικά σου σε συνάρτηση για να είναι εύκολα χρησιμοποιήσιμος

def number_to_binary(num): #θα ήταν οκ

η λογική σου στο a>0 είναι σωστή ποιό σωστό όμως θα ήταν να έγραφες

def number_to_binary(num): #θα ήταν οκ
  if num>0:
    return bin(num)[2:]

Στο άλλο κομμάτι if num<0 έχεις πολλά λάθη κάποια οφείλονται στο ότι δεν χρησιμοπειείς σωστά την γλώσσα πχ

To a[::-1] αυτό δεν κάνει τίποτα όπως το χρησιμοποιείς δημιουργεί ένα στιγμιαίο αντίγραφο που χάνεται θα έκανε εάν a=a[::-1]

και κάποια είναι λογικά λάθη

πχ το

if a[i]=="0": # αν πχ το α[1]==0 τοτε να το αλλαξει σε 1

a[i]="1"
if a[i]=="1":
a[i]='0'

ακόμα  και εάν δούλευε (εάν το α ήταν λιστα) δεν κάνει τίποτα γιατί αλλάζει το 0 σε 1 και στο επόμενο if το κάνει πάλι 0 δηλαδή κάνεις το 0 σε 0 με τελικό αποτέλεσμα να είναι ο δυαδικός σου όλο 0

 

Αν βάλεις τον κώδικά σου σε συνάρτηση και χρησιμοποιήσεις τον debugger για να βλέπεις τις τιμές των μεταβλητών θα σε βοήθήσει να βρίσκεις τα λάθη

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...