Seite 1 von 1

Integer in Binärdarstellung

Verfasst: Montag 1. November 2004, 05:14
von za0
Hallo liebe Python-Fans,

ich hab' da ein kleines Problemchen:

Ich weiß nicht, wie ich eine Dezimalzahl binär darstellen soll.

Beispiel (sagen wir 8 Bit, little endian):

29 = 000011101

Es soll angeblich mittels >> und & Operator gehen. Aber wie?
Könnte mir da jemand mal auf die Sprünge helfen ?

Danke!

Grüße

za0 :D

Verfasst: Montag 1. November 2004, 06:13
von CM
Hoi

Es gibt kein binäres built-in type in Python. Aber es gibt da diese interessante Seite:

http://aspn.activestate.com/ASPN/Cookbo ... ipe/219300

Rückverwandlung geht beispielsweise so:

Code: Alles auswählen

>>> int('101010',2)
42
;-)

Was Dich aber wohl glücklich machen könnte findet sich erst hier:
http://aspn.activestate.com/ASPN/Cookbo ... ipe/111286
Hier findest Du die eigentliche Antwort auf Deine Frage. Hoffe ich jedenfalls. Wenn nicht, kannst Du ja nochmal nachfragen.

Gruß,
Christian

Danke!

Verfasst: Montag 1. November 2004, 06:32
von za0
Moin!

Danke Christian! :D

Grüße

za0

Verfasst: Montag 1. November 2004, 06:41
von za0
Hi Pythoniers,

wie packe ich Nullen davor(?):

Code: Alles auswählen

bstr = lambda n: n>0 and bstr(n>>1)+str(n&1) or ''
Momentan beschränkt sich die Ausgabe nur auf das höchste Bit
der zu konvertierenden Zahl.
Also bei 23 lautet die Ausgabe '10111'
Ziel wäre dann:
23 = '00010111'
129 = '01000001'
usw

Grüße
za0

Yeah!

Verfasst: Montag 1. November 2004, 07:06
von za0
Hi,

nun die Lösung hab ich doch noch selbst geschaft:

Code: Alles auswählen

import sys      # import module sys for sys.stdin.readline()

print "Gib' eine (Integer-) Zahl ein ! : "
input = sys.stdin.readline()    # read input
zahl = int(input)               # convert input(is string) to int

bits = 8;                       # how many bit(s) ?

i2b = lambda n: n>0 and i2b(n>>1)+str(n&1) or ''  # convert integer to binary

out = ''                        # out is empty by default

while (len(out)+len(i2b(zahl)))<bits: # while 
    out += '0';

binzahl = out + i2b(zahl)       # merge amount of zeros with converted value

print binzahl                   # output
Grüße

za0

Verfasst: Montag 1. November 2004, 07:18
von mawe
Guten Morgen!

Eine etwas kürzere Variante:

Code: Alles auswählen

print "Zahl: "
zahl = input()

i2b = lambda n: n>0 and i2b(n>>1)+str(n&1) or ''

binzahl = "%08i" % int(i2b(zahl))

print binzahl
Gruß, mawe

Verfasst: Montag 1. November 2004, 13:05
von Dookie
Mahlzeit,

es geht auch noch kürzer:

Code: Alles auswählen

print "Zahl: "
zahl = input() 
bits = 8

binzahl = "".join(["01"[bool(zahl & 2**x)] for x in xrange(bits-1,-1, -1)])

print binzahl

Gruß

Dookie

Verfasst: Montag 1. November 2004, 15:22
von za0
Mahlzeit,
Dookie hat geschrieben:Mahlzeit,

es geht auch noch kürzer:

Code: Alles auswählen

print "Zahl: "
zahl = input() 
bits = 8

binzahl = "".join(["01"[bool(zahl & 2**x)] for x in xrange(bits-1,-1, -1)])

print binzahl

Gruß

Dookie
Junge, du "mikrotisierst" wohl alles, was?

Hehe ;)

Danke für Dein Posting :D

Grüße

za0

Verfasst: Montag 1. November 2004, 16:03
von Dookie
"Ich liebe es wenn ein Code funktioniert!" (Dookie der Hannibal unter den Pythoncodern) ;)

Mit Python2.4 gehts noch um 2 zeichen kürzer:

Code: Alles auswählen

binzahl = "".join("01"[bool(zahl & 2**x)] for x in xrange(bits-1,-1,-1))

Gruß

Dookie

Verfasst: Montag 1. November 2004, 16:57
von CM
Hoi

Bin gerade erst bei der Arbeit.
Ihr habt da ja wirklich ein paar tolle Sachen zusammengetragen. Chapeau!

Gruß,
Christian

Verfasst: Dienstag 2. November 2004, 00:04
von Dookie
noch eine kleine Optimierung:

Code: Alles auswählen

print "Zahl: "
zahl = input()
bits = 8

binzahl = "".join(["01"[zahl>>x & 1] for x in xrange(bits-1,-1,-1)])

print binzahl
Dookie

Verfasst: Dienstag 2. November 2004, 19:04
von Milan
Hi. Hat das einen tieferen Sinn, bits auf 8 festzusetzen? Ich würde das hier bevorzugen:

Code: Alles auswählen

import math
print "Zahl: " 
zahl = input() 
bits = int((math.log(zahl)/math.log(2))+1)
binzahl = "".join(["01"[zahl>>x & 1] for x in xrange(bits-1,-1,-1)]) 
print binzahl
mfg Milan

Verfasst: Dienstag 2. November 2004, 19:09
von Dookie
Hi Milan,

Denke schon, es hat den Sinn, daß 8 Bit ein Byte darstellen. Besonders bei Logischen Verknüpfungen können auch die vorderen Bits wichtig werden z.B. in dem anderen Thread wo es um XNOR geht.
Andere geläufige Werte sind noch 16, 32, oder 64 Bit oder auch 4 bit (ein sogenanntes Nibble) das sich in Hex mit einer einzigen Stelle (0-9A-Z) darstellen lässt.


Gruß

Dookie

Verfasst: Dienstag 2. November 2004, 20:25
von Milan
Hach ja, ich bin mal wieder in der Diskussion um den Quellcode vom Problem abgeschweift, das oben 8 bits gesucht waren :oops: ... Naja, das wäre jedenfalls die allgemeine Variante, um nur die Zahl binär darzustellen :wink:

mfG Milan

Verfasst: Dienstag 2. November 2004, 21:54
von Dookie
Macht ja nix ;)

IMHO macht aber Binärdarstellung nur wirklich Sinn wenn alle Bits einer Verarbeitungseinheit (Byte Word Longword) angezeigt werden. Bei Logischen Verknüpfungen sind so die Zusammenhänge offensichtlicher als ohne führende Nullen.


Gruß

Dookie