Exercice 5

In [1]:
def table_verite_2bits(fonctionbool):
    print('|{:^10}|{:^10}|{:^15}|'.format('a','b',fonctionbool.__name__+'(a,b)'))
    for a in [True, False]:
        for b in [True, False]:
            print('|{:^10}|{:^10}|{:^15}|'.format(int(a), int(b), int(fonctionbool(a,b))))
In [2]:
table_verite_2bits(bool.__or__)
|    a     |    b     |  __or__(a,b)  |
|    1     |    1     |       1       |
|    1     |    0     |       1       |
|    0     |    1     |       1       |
|    0     |    0     |       0       |
In [5]:
def table_verite_2bitsV2(fonctionbool):
    print('|{:^10}|{:^10}|{:^15}|'.format('a','b',fonctionbool.__name__+'(a,b)'))
    for a in [1, 0]:
        for b in [1, 0]:
            print('|{:^10}|{:^10}|{:^15}|'.format(bool(a), bool(b), int(fonctionbool(bool(a),bool(b)))))
In [6]:
table_verite_2bitsV2(bool.__or__)
|    a     |    b     |  __or__(a,b)  |
|    1     |    1     |       1       |
|    1     |    0     |       1       |
|    0     |    1     |       1       |
|    0     |    0     |       0       |
In [8]:
table_verite_2bitsV2(bool.__xor__)
|    a     |    b     | __xor__(a,b)  |
|    1     |    1     |       0       |
|    1     |    0     |       1       |
|    0     |    1     |       1       |
|    0     |    0     |       0       |

Opérations bit à bit

Préfixe réseau

In [8]:
def ip2liste(ip):
    return [int(champ) for champ in ip.split('.')]
In [7]:
def liste2ip(ipliste):
    return '.'.join(str(n) for n in ipliste)
In [6]:
def prefixe_reseau(ip, masque):
    """Retourne le prefixe réseau à partir d'une adresse IP à partir dun masque
    Vérification sur http://cric.grenoble.cnrs.fr/Administrateurs/Outils/CalculMasque/
    """
    ipliste = ip2liste(ip)
    masqueliste = ip2liste(masque)
    return liste2ip([ipliste[k] & masqueliste[k] for k in range(4)])
In [128]:
def suffixe_machine(ip, masque):
    ipliste = ip2liste(ip)
    masqueliste = ip2liste(masque)
    prefixeliste = ip2liste(prefixe_reseau(ip, masque))
    return liste2ip([ipliste[k] ^ prefixeliste[k] for k in range(4)])
In [129]:
print(prefixe_reseau('145.245.11.254','255.255.252.0'))
print(suffixe_machine('145.245.11.254','255.255.252.0'))
145.245.8.0
0.0.3.254

Recherche dichotomique

In [130]:
def recherche_dicho2(L, e):
    x = 0
    n = len(L)
    pas = n >> 1
    while pas >= 1:
        while x + pas < n and L[x + pas] <= e:
            x = x + pas
        pas = pas >> 1
    return L[x] == e
In [131]:
recherche_dicho2([1,4,8,10],4)
Out[131]:
True

Cacher un nombre dans un autre

In [58]:
public = 1 << 3
In [59]:
public
Out[59]:
8
In [60]:
secret = 3
In [61]:
public = public | secret
In [62]:
public
Out[62]:
11
In [64]:
bin(public)
Out[64]:
'0b1011'
In [67]:
public & ((1 << 2) - 1)
Out[67]:
3
In [69]:
bin(1 << 8)
Out[69]:
'0b100000000'
In [101]:
ord("\U0001F0A7")
Out[101]:
127143
In [102]:
chr(127143)
Out[102]:
'🂧'
In [104]:
print("\U0001F0AD")
🂭
In [111]:
sept_pique = "\U0001F0A7"
print(reine_pique)
🂧
In [119]:
reine_carreau = "\U0001F0CD"
print(reine_carreau)
🃍
In [120]:
difference = ord(reine_carreau) ^ ord(reine_pique)
print(chr(difference))
j
In [121]:
difference
Out[121]:
106
In [122]:
chr(ord(reine_carreau) ^ difference)
Out[122]:
'🂧'