1
votes

Pourquoi la sortie du code ci-dessous est comme ça

Selon ma compréhension des opérateurs binaires, le code ci-dessous ne doit s'exécuter que lorsque i et j sont égaux à 5, pour toutes les autres valeurs de i et j, si la condition doit être évaluée à False. mais j'obtiens le résultat suivant:

# i, j, i & j, binary value of i, binary value of j, bitwise and of i == 5 and j == 5
5 5 5 0b1 0b1 True
5 7 5 0b1 0b0 False
5 13 5 0b1 0b0 False
5 15 5 0b1 0b0 False
5 21 5 0b1 0b0 False
5 23 5 0b1 0b0 False
5 29 5 0b1 0b0 False

Résultat:

for i in range(30):
    for j in range(30):
        if i == 5 & j == 5:
            print(i, j, i & j, bin(i==5), bin(j==5), i == 5 & j == 5)

Questions:

  1. La valeur binaire de i et j est 1 uniquement pour le 1er cas, alors pourquoi d'autres cas sont-ils imprimés?

  2. pourquoi le résultat est imprimé là où i & j est évalué à 5

  3. Si je change l'ordre des conditions dans l'instruction if ci-dessus, i acquiert les valeurs 5, 7, 13, 15, 21, 23, 29 tandis que j reste 5 et les autres sorties sont également les mêmes. pourquoi?

  4. Pour le code ci-dessus, i = 7 et j = 5, i & j est également évalué à 5. Alors pourquoi il n'est pas imprimé?


1 commentaires

Vérifiez votre code s'il vous plaît. J'obtiens des résultats différents. Quelle version de Python utilisez-vous?


3 Réponses :


1
votes

Réponse courte vous avez manqué les crochets:

for x in range(0, 32):
    print(x & 2, bin(x), bin(2), bin(x & 2))

Commencez par évaluer (i == 5) et (j == 5) puis comparez le booléen résultant avec l'autre booléen résultant. p >

Ou comme mentionné ci-dessous, utilisez simplement et. Si vous voulez explorer un peu plus cela, regardez simplement le résultat de ce qui suit:

for i in range(30):
    for j in range(30):
        if (i == 5) &  (j == 5):
            print(i, j, i & j, bin(i==5), bin(j == 5), i == 5 & j == 5)

Comment cela fonctionne en détail, vous pouvez trouver ici:

https://wiki.python.org/moin/BitwiseOperators

p>


0 commentaires

2
votes

Utilisez l'opérateur "et" au lieu de "&". cela résoudra votre problème.

et: opérateur logique
&: opérateur binaire

5 5 5 0b1 0b1 True

Résultat:

for i in range(30):
    for j in range(30):
        if i == 5 and j == 5:
            print(i, j, i & j, bin(i==5), bin(j==5), i == 5 & j == 5)

Référence 1:

Différence entre 'et' (booléen) et '&' ( bitwise) en python. Pourquoi une différence de comportement entre les listes et les tableaux numpy?

Référence 2:

https://stackoverflow.com/a/3845072/1855988


2 commentaires

pourquoi est-ce le cas? Veuillez ajouter une explication, ou même simplement un lien, expliquant pourquoi cela est nécessaire / quelle est la différence.


@GezaKerecsenyi, j'étais en train de modifier ma réponse pour donner plus de détails.



2
votes

De la documentation

Contrairement à C, toutes les opérations de comparaison en Python ont la même priorité, qui est inférieure à celle de toute opération arithmétique, de décalage ou bit à bit . Contrairement à C, les expressions comme a

donc ici:

i == 5 and j == 5

ce qui se passe, c'est que 5 & j est testé contre i et 5 pour l'égalité. Donc, la mise entre parenthèses fonctionnerait, mais la bonne façon est d'utiliser les opérateurs logiques et qui ont une priorité plus élevée:

i == 5 & j == 5

it également des courts-circuits , ce qui signifie que si i! = 5 , j n'est même pas testé (exécution plus rapide). S'applique parfaitement à cet exemple.


1 commentaires

Merci de répondre. J'ai réalisé mon erreur un jour plus tard.