Verstaendnisproblem beim Dualsystem

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
ZimZalabim
User
Beiträge: 3
Registriert: Freitag 18. Oktober 2013, 16:43

Hallo Zusammen

Ich bin ein Neuling sowohl bei Python3 als auch bein Programmieren an sich. Programmieren tu ich mit Gedit und python3 3.3.1 im Terminal(Betriebsystem ist Lubuntu).

Auf Wikipedia hab ich mir das Umrechnen von Dezimal in Binaer Zahlen angesehen. Die erste Varieante mit Modulo hab ich hin gekriegt.

Code: Alles auswählen

dez_zahl = 127
bin_zahl = []
a = dez_zahl
while a > 0:
	quotient = a / 2
	quotient = int(quotient)
	rest = a % 2
	if rest == 1:
		bin_zahl.append(1)
	else:
		bin_zahl.append(0)
	a = a - quotient - rest
		
print ("dez_zahl = ",dez_zahl," bin_zahl = ",bin_zahl)

Das Fuktioniert auch, aber die zweite Varieante versteh ich nicht.
Genauer wie soll das mit der Wertigkeit funktionieren.

Code: Alles auswählen

dez_zahl = 127 # 01111111 binaer
bin_zahl = []
zwpot = 0
x = 0
while zwpot < dez_zahl:
	zwpot = pow(2,x)
	x = x + 1
'''	
die Schleife müsste bei 2^7 = 128 abbrechen, x = 8
wenn ich das richtig verstehe s = 127(dez) - 128(zwpot) --> -1
'''
So weit bin ich bis jetzt.

Vielen Dank für eure Hilfe
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Willkommen zum Forum, zum Programmieren und zu Python!

Damit wir dir helfen koennen: Was verstehst du denn nicht und was erwartest du als Ergebnis?

Waehrend dein erstes Fragment tatsaechlich die binaere Repraesentation (alles nur Repraesentationen! Es gibt keine Binaerzahlen oder Dezimalzahlen, das sind nur verschiedene Schreibweisen!) berechnet, errechnet das zweite Fragment wie viele Bits man benoetigt um die Zahl binaer zu kodieren (d.h. wie viele stellen die binaere Repraesentation hat).
BlackJack

Noch ein Tipp zum ersten Beispiel und dem `quotient`: Es gibt neben dem ``/``- auch den ``//``-Operator der direkt nur den ganzzahligen Anteil des Divisionsergebnis liefert. Und wenn man das noch kompakter schreiben möchte, gibt es die `divmod()`-Funktion die sowohl den ganzzahligen Anteil als auch den Rest der Division liefert.

Ausserdem ist das ``if``/``else`` überflüssig denn beim Rest kann nur 1 oder 0 heraus kommen. Und immer wenn eine 1 heraus kommt, hängst Du eine 1 an das Ergebnis und immer wenn es eine 0 ist dann hängst Du eine 0 an das Ergebnis. Ergo kannst Du auch gleich den Rest selbst an das Ergebnis anhängen.
ZimZalabim
User
Beiträge: 3
Registriert: Freitag 18. Oktober 2013, 16:43

@cofi: Ich weis das binaer nur einer andere Darstellung ist
@BlackJack: Danke für die Tipps.
Wikipedia --> Dualsystem
Eine andere Methode ist die Subtraktionsmethode. Bei dieser subtrahiert man jeweils die größtmögliche Zweierpotenz von der umzurechnenden Dezimalzahl. Wenn die nächstgrößte Zweierpotenz größer als die Differenz der vorherigen Subtraktion ist, so ist die Wertigkeit der nächsten Binärstelle 0. Andernfalls ist die nächste Binärstelle 1, und die Zweierpotenz wird abgezogen. Um diese Methode zu verdeutlichen, bedienen wir uns weiter des Beispiels der Zahl 41:
Für dez_zahl = 41 ist das erste ergebnis = dez_zahl - 2^5 = 9, Wie kommt man darauf das die Werteigkeit hier 1 ist?
Ich weis das da 101001 raus kommt. Was ist da mit diverenz gemeint? Da wird nicht 2^4=16 mit 9 verglichen dann müsste wertigkeit = 0 sein.

Vielleicht wirds jetzt klarer wo es harkt.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@ZimZalabim:
Dreh das doch mal um und versuche die Zahl 41 aus 2^n Summanden zu bilden, dann wird Dir klar, wofür die 1/0 steht. (Tipp: nimms als Faktor der Summanden)
ZimZalabim
User
Beiträge: 3
Registriert: Freitag 18. Oktober 2013, 16:43

@jerch: 41(dez) = 2^5 + 2^3 + 2^0 = 32 + 8 + 1 = 101001
so weit so gut. Wenn i = 0 ist und 2^i, dann müsst i erst 3 dann 2 erhöht werden. wenn es dann noch mal um 1 erhöht wird, also i = 6, ist 2^i größer als 41.

Irgend wie seh ich immer noch nicht wie das funktioniert. Vielleicht seh ich auch den Wald vor lauter Bäumen nicht.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@ZimZalabim:
Das mit dem Faktor hast du überlesen:

1 * 2⁵ + 0 * 2⁴ + 1 * 2³ + 0 * 2² + 0 * 2¹ + 1 * 2⁰

Das ist übrigens für alle Stellenwertsysteme so, z.B.:

1990 = 1 * 10³ + 9 * 10² + 9 * 10¹ + 0 * 10⁰

Vgl aus Wikipedia (http://de.wikipedia.org/wiki/Stellenwertsystem):
Bild
Antworten