Binärdarstellung von Zahlen

Das Wissen über die Binärdarstellung von Zahlen, also deren Codierung im Computer, gehört zum Grundwissen eines jeden (angehenden) Informatikers. In meinem Beitrag Computer und Zahlen sowie den dazugehörigen Unterbeiträgen habe ich Dir dargestellt, wie Zahlen gemeinhin im Computer gespeichert werden. In Bezug auf ganze Zahlen verhält sich Python insoweit abweichend, als Python für diese Langzahlarithmetik implementiert (siehe auch das Video im Tutorial), sodass eine ganze Zahl nicht an die Bit-Breite des Prozessors gebunden sind.

Wenn in der Schule oder auch der Uni über die Kodierung ganzer Zahlen oder auch Gleitkommazahlen gesprochen wird, ist aber in der Regel deren hardwarenahe Kodierung gemeint. Der oben genannte Beitrag basiert auf dieser Sichtweise.

Implementierung der Binärdarstellung von Zahlen

Wenn Du meine Beiträge Ganze Zahlen und Gleitkommazahlen gelesen hast, weißt Du, wie diese im Allgemeinen im Computer kodiert werden. Ich habe Dir dort ebenso beschrieben, wie Du die Binärdarstellung von Zahlen ermittelst. Das ist, wenn man es von Hand ausführt, jedoch ziemlich umständlich. Ich habe die daher ein Modul binary.py geschrieben, welches Dir die Arbeit abnimmt.

binary.pyimplementiert vier Funktion. Diese wandeln vorzeichenbehaftete Ganz- und Gleitkommazahlen in Bitstrings um bzw. generieren aus entsprechenden Bitstring die dezimalen Werte als Ganz- oder Gleitkommazahlen. Es gibt zur Lösung der jeweiligen Aufgabe unterschiedliche Wege, die nach Rom führen. Ich habe hier Lösungen gewählt, die ohne die Installation von Zusatzmodulen auskommen. Das heißt, Du kannst mein Modul verwenden, ohne irgendwas zusätzlich installieren zu müssen./p>

Die Funktionen sind kommentiert, sodass Du sie sicher ohne weitere Erläuterungen verwenden kannst.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
Projekt.....: Tutorial (python-lernen.online)
Datei.......: /binary.py
Beschreibung: Binären Kodierung von Zahlen mit Vorzeichen
Anforderung.: Python 3.10
Autor.......: Karsten Brodmann (karsten.brodmann@osnanet.de)
Datum.......: 24.05.2023
Version.....: 1.0
"""

import struct


def float2bin(wert: float) -> str:
    """
    Ermittlung der binären Kodierung einer Gleitkommazahl.

    Da 'float' in Python einem 'double' gemäß IEEE-754 entspricht,
    erfolgt die Ausgabe als 64-Binärstring.

    :param wert: Gleitkommazahl
    :return: Binärzeichenkette
    """
    # als 'double' packen und als 'unsigned long long' entpacken (Big Endian)
    [d] = struct.unpack(">Q", struct.pack(">d", wert))
    # links mit Nullen aufgefüllt zurückgeben
    return "{:064b}".format(d)


def bin2float(binstr: str) -> float:
    """
    Binärstring eines 'float'-Wertes in dessen dezimalen Wert konvertieren.

    :param binstr: Binäre Darstellung eines Gleitkommawertes
    :return: Gleitkommazahl
    """
    bytepuffer = int(binstr, 2).to_bytes(8, byteorder="big")
    return struct.unpack('>d', bytepuffer)[0]


def int2bin(wert: int, bits: int = 64) -> str:
    """
    Ermittlung der Binärkodierung ganzer Zahlen.

    :param wert: zu kodierende Ganzzahl (dezimal)
    :param bits: Anzahl der Bits (Standard = 64)
    :return: Binärzeichenkette
    """
    # Überprüfung des Wertebereichs für die angegebene Bit-Anzahl
    if wert > 2 ** (bits - 1) - 1 or wert < -2 ** (bits - 1):
        raise "FEHLER - zu wenig Bits"
    # binäre Zeichenkette (bei negativen Zahlen das 2er-Komplement)
    binstr = bin(wert if wert >= 0 else wert + (1 << bits))
    # Ausgabe formatieren: '0b' abschneiden, Rest links mit Nullen füllen
    binstr = binstr[2:].zfill(bits)
    return binstr


def bin2int(binstr: str, bits: int = 64) -> int:
    """
    Binärstring eines 'int'-Wertes in dessen dezimalen Wert konvertieren.

    Ist das höchstwertige Bit eine '1', wird der String als negative Zahl im
    2er-Komplement interpretiert. Ein ggf. gewünschtes Auffüllen mit Nullen
    kann durch Angabe der Bit-Anzahl automatisch vorgenommen werden.

    :param binstr: Binäre Darstellung eines ganzzahligen Wertes
    :param bits: Anzahl der Bits
    :return: ganze Zahl (mit Vorzeichen)
    """
    if bits < len(binstr):
        raise "FEHLER - zu wenig Bits"
    binstr = binstr.zfill(bits)
    if binstr[0] == "1":
        # invertiere Binärstring
        binstr = ''.join('1' if d == '0' else '0' for d in binstr)
        wert = -(int(binstr, 2) + 1)
    else:
        wert = int(binstr, 2)
    return wert


if __name__ == '__main__':
    # Ganze Zahlen eines 4-Bit-Computers
    for i in range(7, -9, -1):
        print("{:2d}: {}".format(i, int2bin(i, 4)))

Mithilfe der obigen Funktionen kannst Du die Binärdarstellung von Zahlen, die ich Dir in meinen Hintergrundbeiträgen erläutert habe, direkt und einfach nachvollziehen.

Schreibe einen Kommentar