Binärsystem

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
PhilippK
User
Beiträge: 9
Registriert: Sonntag 13. August 2006, 21:43
Wohnort: Berlin

Hallo Python-Profis,
Ich wollte mal fragen, ob es eine Build-in-methode gibt, mit der mal eine Zahl aus dem Dezimalsystem in das Binärsystem umrechnen kann und umgekehrt.

Danke schonmal im Vorraus
Philipp
pSy
User
Beiträge: 44
Registriert: Montag 4. Oktober 2004, 17:58
Kontaktdaten:

soweit ich weis, nein...

aber an sich ist sowas leicht zu schreiben... oder auch im netz zu finden.

das hier habe ich jetzt eben schnell mal gefunden... ist aber nicht getestet:

Code: Alles auswählen

def dec2bin(num):
	out = []
	while(num != 0):
		out.append(num % 2)
		num = num / 2
	out = pad(out)
	return out
Quelle: http://aspn.activestate.com/ASPN/Cookbo ... ipe/259112
pSy
User
Beiträge: 44
Registriert: Montag 4. Oktober 2004, 17:58
Kontaktdaten:

So nun hab ichs mir nochmal angeschaut...

Musste ein wenig umschreiben. So wird nun 'n Schuh draus:

Code: Alles auswählen

# -*- coding: utf-8 -*-
#http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/259112

def dec2bin(num):
	out = []
	while(num != 0):
		out.append(num % 2)
		num = num / 2
	return out

def bin2dec(the_list):
	sum = 0
	i = 0
	while(i < len(the_list)):
		sum = sum + pow(2,i) * the_list[i]
		i = i + 1
	return sum
PhilippK
User
Beiträge: 9
Registriert: Sonntag 13. August 2006, 21:43
Wohnort: Berlin

Dann werd ich wohl mit solchen selbstgeschriebenen Methoden vorlieb nehmen müssen.
Vielen Dank pSy für deine Mühe.

EDIT:
Die Methode bin2dec scheint alle Nullen am Ende der Eingabe zu ignorieren und dec2bin gibt das Ergebnis falsch rum aus (anstatt 1011 steht da 1101).
Ich hab jetzt selbst passende Methoden geschrieben:

Code: Alles auswählen

def dec2bin(zahl):
    binListe = []
    binzahl = ""
    while zahl <> 0:
        binListe.append(zahl % 2)
        zahl = int(zahl / 2)
    for i in binListe[::-1]:
        binzahl += str(i)
    return binzahl

def bin2dec(zahl):
    stelle = 0
    deczahl = 0
    for i in str(zahl)[::-1]:
        deczahl += int(i)*2**stelle
        stelle += 1
    return deczahl
pSy
User
Beiträge: 44
Registriert: Montag 4. Oktober 2004, 17:58
Kontaktdaten:

Jupp, das hab ich übersehen... hab ja auch nur schnell geschaut das die überhaupt funktionieren... :)

Übrigens: Du zauberst ja ganz schön was mit den Listen zusammen... das mit liste[::-1] kannte ich noch garnicht... danke ;)
PhilippK
User
Beiträge: 9
Registriert: Sonntag 13. August 2006, 21:43
Wohnort: Berlin

Ich weiß es auch erst seit heute. :D
Habs durch suchen hier im Forum rausgefunden.
BlackJack

`bin2dec()` geht kürzer:

Code: Alles auswählen

def bin2dec(number):
    return int(number, 2)
Wobei die Namensgebung korrekter `int2bin()`/`bin2int()` wäre. Mit Dezimalzahlen hat das ganze nichts zu tun.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

BlackJack hat geschrieben:`bin2dec()` geht kürzer:

Code: Alles auswählen

def bin2dec(number):
    return int(number, 2)
Dann muss "number" aber ein String sein.
Oder man macht's so:

Code: Alles auswählen

def bin2dec(number):
    return int(str(number), 2)
PhilippK
User
Beiträge: 9
Registriert: Sonntag 13. August 2006, 21:43
Wohnort: Berlin

Wow nicht schlecht.
Das sowas geht wusste ich noch gar nicht.

Vielen Dank dafür.
Philipp
pSy
User
Beiträge: 44
Registriert: Montag 4. Oktober 2004, 17:58
Kontaktdaten:

Ich auch nicht :shock:

Also kann man die Basis als zweiten Parameter an int() übergeben? Aber dann wahrscheinlich nur, wenn man unter der 10 bleibt, richtig? Ich schlag gleich mal nach...

EDIT:
Man sollte sich wirklich auch mal über die Standartinformationen informieren *g*
int( [x[, radix]])

Convert a string or number to a plain integer. If the argument is a string, it must contain a possibly signed decimal number representable as a Python integer, possibly embedded in whitespace. The radix parameter gives the base for the conversion and may be any integer in the range [2, 36], or zero. If radix is zero, the proper radix is guessed based on the contents of string; the interpretation is the same as for integer literals. If radix is specified and x is not a string, TypeError is raised. Otherwise, the argument may be a plain or long integer or a floating point number. Conversion of floating point numbers to integers truncates (towards zero). If the argument is outside the integer range a long object will be returned instead. If no arguments are given, returns 0.
[size=x-small]Quelle: http://docs.python.org/lib/built-in-funcs.html[/size]
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Noch eine Möglichkeit:

Code: Alles auswählen

def dec2bin(x):
 if x<0:
  raise ValueError("Nur positive Zahlen, bitte")
 l = []
 while True:
   x,r = divmod(x,2)
   l.insert(0,str(r))
   if x == 0:
    return "".join(l)
Joey_das_Chameleon
User
Beiträge: 13
Registriert: Sonntag 9. Dezember 2007, 19:44

Wieso geht dann nicht?:

Code: Alles auswählen

def dec2bin(number):
    return int(str(number), 10)

BlackJack

Das wandelt ein Objekt in eine Zeichenkette und die dann in eine ganze Zahl, wobei die Zeichenkette als Darstellung eine Zahl im Dezimalsystem aufgefasst werden soll. Das "geht" schon, nur kommt da keine Zeichenkette einer Zahl in Binärdarstellung heraus. Warum das so ist, sollte eigentlich klar sein.
Joey_das_Chameleon
User
Beiträge: 13
Registriert: Sonntag 9. Dezember 2007, 19:44

thx
Antworten