4-Bit-MiniInt
# -*- coding: iso-8859-1 -*-
# mk, 15.9.08, 9.11.08
# 4-Bit-Int
# Dictionary Z = { key:wert,.. }
Z = {0:[0,0,0,0],1:[0,0,0,1],2:[0,0,1,0],3:[0,0,1,1],
     4:[0,1,0,0],5:[0,1,0,1],6:[0,1,1,0],7:[0,1,1,1],
     -8:[1,0,0,0],-7:[1,0,0,1],-6:[1,0,1,0],-5:[1,0,1,1],
     -4:[1,1,0,0],-3:[1,1,0,1],-2:[1,1,1,0],-1:[1,1,1,1]}
def Itoi(a):
    """
    Int a wird in ein MiniInt umgewandelt
    """
    return Z[a]   # lesender Zugriff auf globale Variable Z
def itoI(b):
    """
    MiniInt b  wird in Int umgewandelt
    """
    for k in Z.keys():
        if Z[k]==b:
            return k
def ha(a,b):
    """
    Halbaddierer, a = 0 oder 1, b = 0 oder 1
    """
    s  = a^b
    ue = a&b
    return [s,ue]
def va(a,b,c):
    """
    Volladdierer, a = 0 oder 1, b = 0 oder 1, v = 0 oder 1,
    """
    [s1,ue1] = ha(a,b)
    [s,ue2] = ha(s1,c)
    ue = ue1|ue2
    return [s,ue]
def gl(a,b):
    """
    die beiden Listen a und b werden dadurch auf gleiche Länge gebracht,
    dass die kürzere von vorne mit Nullen aufgefüllt wird
    die Listen werden als [a,b] zurückgegeben
    """
    na = len(a)
    nb = len(b)
    if na < nb:
        n = nb
        while len(a) < n:
            a = [0]+a
    else:
        n = na
        while len(b) < n:
            b = [0]+b
    return [a,b]
def addbin(a,b):
    """
    die beiden 'Binär-Listen' a und b werden addiert
    """
    [a,b] = gl(a,b)
    n = len(a)
    ue = 0
    s = []
    for i in range(n-1,-1,-1):
        [si,ue] = va(a[i],b[i],ue)
        s = [si]+s
    return s
def add1(a):
    """
    zur 'Binär-Liste' a wird 1 addiert,
    dabei wird ein Übertrag nicht berücksichtigt
    """
    n = len(a)
    s = []
    ue = 1
    for i in range(n-1,-1,-1):
        [si,ue] = ha(a[i],ue)
        s = [si]+s
    return s
def sub1(a):
    """
    von der 'Binär-Liste' a wird 1 subtrahiert,
    dabei wird ein Übertrag nicht berücksichtigt
    """
    n = len(a)
    s = []
    ue = 0
    for i in range(n-1,-1,-1):
        [si,ue] = va(a[i],1,ue)
        s = [si]+s
    return s
def zweierkomplement(a):
    """
    zur 'Binär-Liste' a wird das Zweierkomplement gebildet
    """
    a = a[:]       # erst kopieren, damit es keine Seiteneffekte gibt
    n = len(a)
    for i in range(n):
        a[i] = 1-a[i]
    return add1(a)
def subbin(a,b):
    """
    die 'Binär-Liste' b wird von der 'Binär-Liste' a subtrahiert
    """
    b2 = zweierkomplement(b)
    return addbin(a,b2)
def testadd(a,b):
    return itoI(addbin(Itoi(a),Itoi(b)))
def testsub(a,b):
    return itoI(subbin(Itoi(a),Itoi(b)))
miniint.py