Extra#

Functie 5#

In de basis opgaven zag je een manier om twee binaire getallen op te tellen: zet ze eerst om naar grondtal 10, tel deze getallen op en zet vervolgens de uitkomst weer om naar een binaire string.

Bij deze opgave zal je echter een andere, meer directe, methode implementeren voor het optellen van twee binaire getallen, met behulp van de “basisschool” methode:

def add_b(s, t):
    """
    optellen van binaire getallen via de basisschool methode
    """
    carry = "0" 
    result = ""
    
    # binaire getallen even lang maken. 
    if len(s) > len(t):
        t = (len(s) - len(t)) * "0" + t
    else:
        s = (len(t) - len(s)) * "0" + s
    # basisschool methode optellen.     
    for _ in range(0, len(s)):
        if s[-1] == "0" and t[-1] == "0": # 0 + 0 = 0
            result = carry + result
            carry = "0"
        elif s[-1] == "1" and t[-1] == "1": 
            if carry == "0":  # 1 + 1 + 0 = 10
                result = "0" + result
                carry = "1"
            else: #1 + 1 + 1 = 11
                result = "1" + result
                carry = "1"
        else:
            if carry == "0":  # 1 + 0 + 0 = 10
                result = "1" + result
            else: #1 + 0 + 1 = 10
                result = "0" + result
                carry = "1"
        s = s[:-1]
        t = t[:-1]
    # carry toevoegen indien nodig. 
    if carry == "1": 
        result = carry + result
    return result

Functie 6#

Schrijf een functie compress(s), waarvan het argument een binaire string s is met een lengte van minder dan of gelijk aan 64 en dat als resultaat een andere binaire string teruggeeft. De resulterende binaire string zou een run-length codering van het origineel moeten zijn, zoals hierboven beschreven.

def compress(s):
    result = ""
    while len(s)> 0:
        cnt = count(s[0], s)
        bi = num_to_base_b(cnt, 2)
        bi = (7 - len(bi)) * "0" + bi
        result = result + s[0] + bi 
        s = s[cnt:]
    return result

Functie 7#

Schrijf vervolgens een functie uncompress(c) die het comprimeren van de functie compress “omkeert” of “ongedaan maakt”.

Dat wil zeggen, uncompress(compress(s)) zou s moeten teruggeven.

def uncompress(s):
    result = ""
    while len(s) > 0:
        c = s[0]
        bi = s[1:8]
        cnt = base_b_to_num(bi, 2)
        result = cnt * c + result
        s = s[8:]
    return result