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. :D
Habs durch suchen hier im Forum rausgefunden.

Verfasst: Montag 14. August 2006, 08:22
von 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.

Verfasst: Montag 14. August 2006, 08:26
von Rebecca
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)

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 :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]

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
Wieso geht dann nicht?:

Code: Alles auswählen

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


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