Integer in Binärdarstellung

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
za0
User
Beiträge: 17
Registriert: Mittwoch 22. September 2004, 19:50

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
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
za0
User
Beiträge: 17
Registriert: Mittwoch 22. September 2004, 19:50

Moin!

Danke Christian! :D

Grüße

za0
za0
User
Beiträge: 17
Registriert: Mittwoch 22. September 2004, 19:50

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
za0
User
Beiträge: 17
Registriert: Mittwoch 22. September 2004, 19:50

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
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

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
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
[code]#!/usr/bin/env python
import this[/code]
za0
User
Beiträge: 17
Registriert: Mittwoch 22. September 2004, 19:50

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
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

"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
[code]#!/usr/bin/env python
import this[/code]
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi

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

Gruß,
Christian
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
[code]#!/usr/bin/env python
import this[/code]
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
[code]#!/usr/bin/env python
import this[/code]
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
[code]#!/usr/bin/env python
import this[/code]
Antworten