Path: csiph.com!newsfeed.xs4all.nl!newsfeed7.news.xs4all.nl!news.uzoreto.com!aioe.org!yQftVy4DpahetLNbzgJWRw.user.gioia.aioe.org.POSTED!not-for-mail From: Alain Ketterlin Newsgroups: fr.comp.lang.python Subject: Re: Usage de ~ qui, ce me semble, veut dire not. Date: Sun, 11 Apr 2021 12:47:41 +0200 Organization: =?utf-8?Q?Universit=C3=A9?= de Strasbourg Lines: 119 Message-ID: <87v98t85de.fsf@universite-de-strasbourg.fr.invalid> References: NNTP-Posting-Host: yQftVy4DpahetLNbzgJWRw.user.gioia.aioe.org Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Complaints-To: abuse@aioe.org User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux) X-Notice: Filtered by postfilter v. 0.9.2 Cancel-Lock: sha1:qxzMSo9MuzdyxO4PSBtAa7lRJjw= Xref: csiph.com fr.comp.lang.python:3458 Dominique writes: >> Je comprends mal le comportement de ~ (le tilde) : >> >> soit a,b=3D5,7 >> >> a>b False normal >> >> a>~b True, r=C3=A9sultat attendu >> >> b> >> b<~a False aussi, et l=C3=A0, je ne comprends pas. Voyez-vous pourquoi >> j'ai ce r=C3=A9sultat inattendu ? Je suppose que, =C3=A0 la question =C2= =AB b pas >> inf=C3=A9rieur =C3=A0 a =C2=BB, je devrais obtenir True... [...] > Bon, mon fils m'a apport=C3=A9 une explication que je ne comprends pas bi= en > mais je vois que not a=3D=3D0 rend True, quelle que soit la valeur de a. Ben non, si a vaut 0, "not a =3D=3D 0" vaut False. > Je d=C3=A9duis que =C2=AB not une variable =C2=BB retourne toujours 0, or= 0 est > False. Hmmm. Il n'y a rien de tel. "not" est la n=C3=A9gation bool=C3=A9enne (qui = change True and False et vice-versa). Son op=C3=A9rande devrait en toute rigueur =C3=AAtre toujours une valeur bool=C3=A9enne. > Mais si x=3D'' (string vide), not x donne True. pourquoi ? Normalement "not" s'applique =C3=A0 un bool=C3=A9en (comme "a =3D=3D 0"), d= onc quand on applique "not" =C3=A0 autre chose, le choix a =C3=A9t=C3=A9 fait de tran= sformer cette autre chose en bool=C3=A9en. Cela n'a aucune signification universell= e, c'est juste une commodit=C3=A9, avec des conventions plus ou moins arbitraire. En gros, "not x" vaut : - si x est None, il est consid=C3=A9r=C3=A9 avoir la valeur bool=C3=A9enne = False (donc "not None" vaut True) - si x est un entier, la valeur 0 est False et toute autre valeur est True ; donc "not x" =C3=A9quivaut =C3=A0 "x =3D=3D 0" - si x est une cha=C3=AEne de caract=C3=A8res, la valeur vide '' vaut False= et toute autre valeur vaut True ; donc "not x" =C3=A9quivaut =C3=A0 "len(x) = =3D=3D 0" etc. Les d=C3=A9tails sont =C3=A0 https://docs.python.org/3/reference/expressions.html#comparisons Tout =C3=A7a pout =C3=A9conomiser quelques caract=C3=A8res... > Pour revenir au tilde, soit a=3D5, ~a donne -6 et ~-5 donne 4... > Pourquoi ? On voit comme un effet miroir avec une r=C3=A9duction de la > valeur relative d'une unit=C3=A9 (~5 donne -5-1 et ~-6 donne 6-1)... Le tilde est l'op=C3=A9ration de n=C3=A9gation bit-=C3=A0-bit (*pas* la n= =C3=A9gation bool=C3=A9enne, une sorte de micro-n=C3=A9gation appliqu=C3=A9e ndividuelle= ment sur les bits qui composent une valeur). Elle change chaque bit en son compl=C3=A9ment. Ce que tu oberves est le r=C3=A9sultat de l'op=C3=A9ration= appliqu=C3=A9e =C3=A0 des donn=C3=A9es qui repr=C3=A9sentent des entiers. C'est li=C3=A9 au codag= e des entiers en "compl=C3=A9ment =C3=A0 deux". Cf. par exemple (plut=C3=B4t la p= age en anglais) : https://fr.wikipedia.org/wiki/Compl%C3%A9ment_%C3%A0_deux https://en.wikipedia.org/wiki/Two%27s_complement Et effectivement, ~x est =C3=A9gal =C3=A0 -(x+1). C'est une propri=C3=A9t= =C3=A9 de cette repr=C3=A9sentation (~0 -> -1, ~1 -> -2, etc.), mais c'est une propri=C3=A9= t=C3=A9 arithm=C3=A9tique, disons, anecdotique : l'op=C3=A9ration ~ inverse individuellement les bits de l'entier, c'est tout. Il existe des microprocesseurs utilisant une autre repr=C3=A9sentation et cette propri=C3= =A9t=C3=A9 n'est pas vraie sur ces processeurs. Pour comprendre ce qui se passe, il faut se souvenir que les entiers sont repr=C3=A9sent=C3=A9s sur un nombre fini de bits (en g=C3=A9n=C3=A9ral= 32 ou 64), et que tous les bits sont invers=C3=A9s. Par exemple, sur 32 bits : 5 est repr=C3=A9sent=C3=A9 par 0...0101 (32 bits en tout, donc 29 fois 0 en= t=C3=AAte). ~5 est donc 1...1010 (avec donc 29 fois 1 en t=C3=AAte) Et 1...1010 c'est la repr=C3=A9sentation de -6. (En python, le nombre de bits pour repr=C3=A9senter un entier n'est pas fix= =C3=A9, mais c'est une autre histoire et =C3=A7a ne change rien =C3=A0 notre propos= . Tu peux imaginer qu'il y a toujours quelques z=C3=A9ros en t=C3=AAte d'une val= eur positive -- et quelques uns en t=C3=AAte d'une valeur n=C3=A9gative.) Le tilde n'est utile que quand on travaille sur des bits individuels (qu'on regroupe en g=C3=A9n=C3=A9ral dans des entiers, parce qu'on n'a pas = mieux). Les autres op=C3=A9rations apparent=C3=A9es sont & | ^ (autres op=C3=A9rati= ons binaires bit-=C3=A0-bit : "and" "or" "xor"), ainsi que << et >> (d=C3=A9calages). Ex= ercice pour le lecteur : pourquoi est-ce que "-1 >> d" vaut -1 quelle que soit la valeur de d ? -- Alain.