Adloun

Le poids de Hamming d'un entier est son nombre de bits à

Exercice supplémentaire · niveau 3 (difficile) · NSI (première), chapitre 1 — Représenter les entiers · Opérateurs binaires et coût des algorithmes

Énoncé

Le poids de Hamming d'un entier est son nombre de bits à . Écrire deux versions : l'une qui parcourt tous les bits, l'autre qui emploie l'identité n & (n - 1) — laquelle efface le bit à le plus à droite. Comparer leur nombre de tours de boucle sur , et exprimer le coût de chacune.

Corrigé


def poids_lent(n):
    k = 0
    while n > 0:
        k = k + n % 2
        n = n // 2
    return k

def poids_kernighan(n):
    """Nombre de bits à 1 : n & (n-1) efface le 1 le plus à droite."""
    k = 0
    while n > 0:
        n = n & (n - 1)
        k = k + 1
    return k

for n in range(0, 5000):
    assert poids_lent(n) == poids_kernighan(n)

Pourquoi n & (n - 1) efface le dernier . Si se termine par , alors se termine par et coïncide avec sur tous les bits de poids supérieur. Le & conserve donc les bits de poids fort et annule le bloc final : exactement un a disparu.

Le coût. La première version fait un tour par bit, soit tours. La seconde fait un tour par bit à . Sur , qui n'a qu'un seul bit à : tours contre .

Contrôle : poids_kernighan(214) rend , ce qui correspond à — cinq uns.

Prolongement : le coût de la seconde version dépend de la valeur de l'entrée, pas seulement de sa taille. Dans le pire cas (tous les bits à ) elle ne gagne rien ; c'est la distinction entre coût au pire et coût en moyenne, que le programme de terminale formalise.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.