3
votes

~ Complément binaire en Python 3

J'ai juste un doute sur le fonctionnement du complément binaire. Par exemple (en python):

a = 0011 1100
~a  = 1100 0011

Donne une sortie: -

-61

Le complément binaire de 60 est:

a = 60
print(~a)

Ne devrait-il pas être -60 ?

Je sais que je me trompe, mais pourquoi il passe à -61?


0 commentaires

3 Réponses :


1
votes

Vous y êtes presque. 1100 0011 est en fait -61 .

Voici comment un binaire négatif est converti en décimal:

  1. Inverser les bits

  2. Ajoutez 1

  3. Convertir en décimal

  4. Ajouter un signe négatif

Donc:

    1100 0011
+   0011 1101
-------------
  1 0000 0000 

De wikipedia Page du complément à deux :

Le complément à deux d'un nombre à N bits est défini comme son complément par rapport à 2 ^ N. Par exemple, pour le nombre à trois bits 010, le complément à deux est 110, car 010 + 110 = 1000.

Ici, le complément de 1100 0011 est 0011 1101 cuz

1100 0011

0011 1100 <-- bits inverted

0011 1101 <-- one added

       61 <-- converted to decimal

      -61 <-- added negative sign


0 commentaires

6
votes

~ est un opérateur d'inversion au niveau du bit et il agit exactement comme défini :

L'inversion binaire de x est définie par - (x + 1).

C'est simplement ainsi que fonctionne l'inversion au niveau du bit de la représentation du complément à deux d'un entier.

/ p>

La roue de complément à deux visualise assez bien cela:

 entrez la description de l'image ici

Comme vous pouvez le voir, l'inversion bit à bit de 1 est -2, l'inversion bit à 2 est -3, ... et l'inversion bit à 60 sera -61.


0 commentaires

1
votes

Dans tous les ordinateurs modernes, le binaire du complément à 2 est utilisé pour représenter des entiers (et non la représentation binaire classique). Comme confirmé dans la documentation Python :

Le binaire du complément à deux est le même que le binaire classique représentation pour les entiers positifs mais est légèrement différente pour nombres négatifs. Les nombres négatifs sont représentés en exécutant la opération de complément à deux sur leur valeur absolue.

Le complément à 2 d'un nombre négatif, -x, est écrit en utilisant le modèle de bits pour (x-1) avec tous les bits complétés (commutés de 1 à 0 ou de 0 à 1). p>

Exemple: Complément 2 de -15:

print(~60) # Outputs -61
print(~-60) # Outputs 59

L'opérateur ~ (PAS au niveau du bit) de Python renvoie le complément 1 du nombre.

Exemple: strong>

print(~14) # Outputs -15

14 est (1110) sous la forme binaire de son complément à 2.

Ici, ~ 14 inverserait (c'est-à-dire le complément à 1) tous les bits sous cette forme à 0001. Cependant, 0001 est en fait le complément à 2 de -15.

Une règle simple pour se souvenir de l'opération NOT au niveau du bit sur les entiers est - (x + 1).

-15 => complement(x-1) => complement(15-1) => complement(14) => complement(1110) => 0001


0 commentaires