Seite 1 von 1
Binärsystem
Verfasst: Sonntag 13. August 2006, 22:26
von PhilippK
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
Verfasst: Sonntag 13. August 2006, 22:46
von pSy
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
Verfasst: Sonntag 13. August 2006, 22:57
von pSy
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
Verfasst: Sonntag 13. August 2006, 23:19
von PhilippK
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
Verfasst: Montag 14. August 2006, 00:27
von pSy
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
Verfasst: Montag 14. August 2006, 00:50
von PhilippK
Ich weiß es auch erst seit heute.
Habs durch suchen hier im Forum rausgefunden.
Verfasst: Montag 14. August 2006, 08:22
von BlackJack
`bin2dec()` geht kürzer:
Wobei die Namensgebung korrekter `int2bin()`/`bin2int()` wäre. Mit Dezimalzahlen hat das ganze nichts zu tun.
Verfasst: Montag 14. August 2006, 08:26
von Rebecca
BlackJack hat geschrieben:`bin2dec()` geht kürzer:
Dann muss "number" aber ein String sein.
Oder man macht's so:
Verfasst: Montag 14. August 2006, 23:46
von PhilippK
Wow nicht schlecht.
Das sowas geht wusste ich noch gar nicht.
Vielen Dank dafür.
Philipp
Verfasst: Dienstag 15. August 2006, 00:11
von pSy
Ich auch nicht
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]
Verfasst: Dienstag 15. August 2006, 18:15
von Joghurt
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)
Verfasst: Sonntag 9. Dezember 2007, 20:14
von Joey_das_Chameleon
Verfasst: Sonntag 9. Dezember 2007, 20:25
von 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.
Verfasst: Sonntag 9. Dezember 2007, 20:28
von Joey_das_Chameleon
thx