Page 1 sur 1

L'inversion binaire : ~

Publié : ven. 12/déc./2014 1:52
par falsam
L'opérateur bit à bit le plus simple est celui çi : ~

Cet opérateur va prendre tout les bits d'un nombre et les inverser, ainsi tout les 0 vont devenir 1 et tout les 1 vont devenir 0.

Cas pratique avec une image.

Code : Tout sélectionner

Enumeration
  #Mainform
EndEnumeration

Enumeration
  #Image0
  #Image1
EndEnumeration

Dim Pixels(0)

;Download d'une image
InitNetwork()
ReceiveHTTPFile("http://www.purearea.net/pb/pics/Fred_2012_2_t.jpg", "test.jpg")

UseJPEGImageDecoder()
LoadImage(0, "test.jpg")
ResizeImage(0, 480, 400)

Width = ImageWidth(0)
Height = ImageHeight(0)

ReDim Pixels(Width*Height)

;Lecture des composant de l'image original
StartDrawing(ImageOutput(0))
For x=0 To Width-1
  For y=0 To Height-1
    Pixels(Index) = Point(x,y)
    Index + 1
  Next
Next
StopDrawing()

index = 0

;Création de l'image inversée : Utilisation de ~
CreateImage(1, Width, Height)
StartDrawing(ImageOutput(1))
For x=0 To Width-1
  For y=0 To Height-1
    Plot(x, y, ~Pixels(Index))
    Index + 1
  Next
Next
StopDrawing()

;Affichage de la fenêtre avec les deux images
OpenWindow(#Mainform, 0, 0, (Width*2)+15, 600, "opérateur d'inversion de bits ~", WindowStyle)
ImageGadget(#Image0, 5, 5, 0, 0, ImageID(0))
ImageGadget(#Image1, Width + 10, 5, Width, Height, ImageID(1))
Repeat : Until WaitWindowEvent(10) = #PB_Event_CloseWindow 
J'aime bien.

Re: L'inversion binaire : ~

Publié : ven. 12/déc./2014 8:33
par SPH
C'est pas du negatif ? :P

Re: L'inversion binaire : ~

Publié : ven. 12/déc./2014 9:02
par kelebrindae
Petit exemple bien sympa de la puissance des opérateurs binaires.

Hum, et euh... Dans quelle mesure est-ce un prétexte pour nous montrer cette photo? :wink:

Re: L'inversion binaire : ~

Publié : ven. 12/déc./2014 10:47
par Fred
kelebrindae a écrit :Hum, et euh... Dans quelle mesure est-ce un prétexte pour nous montrer cette photo? :wink:
Y'a un probleme avec la photo ?? :lol:

Re: L'inversion binaire : ~

Publié : ven. 12/déc./2014 11:31
par Ar-S
On a échapé de peu au coincoin pour le logo de PB ? :mrgreen:
Excellent code :)

Re: L'inversion binaire : ~

Publié : ven. 12/déc./2014 11:55
par kernadec
bonjour
je remarque aussi que Fred semble très proche de "Michael Vogel" :mrgreen:

Cordialement

Re: L'inversion binaire : ~

Publié : sam. 19/mars/2016 8:19
par Shadow
Salut,

Ayant eu besoin de l'inversion binaire ~
J'ai fais des tests et c'était pas concluant donc j'ai du fienté.

Je voulais inverser les bites d'une chaîne binaire (Nombre binaire)
mais ça ne fonctionnais pas comme je voulais.

Mais j'ai trouvé !

Voici un code d’exemple pour comprendre:

Code : Tout sélectionner

Nombre.q = 137

BinOriginal$ = Bin(Nombre.q)
Debug BinOriginal$

BinInverser$ = Bin(~Nombre.q)
Debug BinInverser$

BinInverser$ = Mid(BinInverser$, Len(BinInverser$) - Len(BinOriginal$) + 1)
Debug BinInverser$

Re: L'inversion binaire : ~

Publié : sam. 19/mars/2016 9:54
par Anonyme2
Shadow a écrit :Salut,

Ayant eu besoin de l'inversion binaire ~
J'ai fais des tests et c'était pas concluant donc j'ai du fienté.

Je voulais inverser les bites d'une chaîne binaire (Nombre binaire)
mais ça ne fonctionnais pas comme je voulais.

Mais j'ai trouvé !

Voici un code d’exemple pour comprendre:

Code : Tout sélectionner

Nombre.q = 137

BinOriginal$ = Bin(Nombre.q)
Debug BinOriginal$

BinInverser$ = Bin(~Nombre.q)
Debug BinInverser$

BinInverser$ = Mid(BinInverser$, Len(BinInverser$) - Len(BinOriginal$) + 1)
Debug BinInverser$

Essayes de lire la doc avant de commencer quelque chose.
Je cite la doc de PB sur l'opérateur ~
NOT est une inversion logique (binaire). Vous devez être familiarisé avec les nombres binaires pour utiliser cet opérateur. Le résultat de cet opérateur est une inversion bit à bit de la valeur RHS. La valeur de chaque bit est fixée comme indiqué dans la table ci-dessous. Cet opérateur ne peut être utilisé avec une variable de type chaine.
et ne répond pas que tu savais car si c'était le cas, tu n'aurais pas essayé!

Je pense que tu confonds la valeur d'un nombre et sa représentation en binaire (qui ne peut s'afficher que sous la forme d'une chaine ou alors écrire un code pour tester chaque bit pour l'afficher). De même en hexa, c'est une représentation sous forme de chaine.

~ est aussi appelé complément à 1.

Lorsque l'on fait le complément à un d'un nombre puis que l'on ajoute 1, on a inversé le signe du nombre (on a l'opposé du nombre), c'est le complément à deux.

Par exemple pour le nombre 18, le complément à 2 donnera -18:

Code : Tout sélectionner

a= 18
Debug a
a=  (~a) +1
Debug a
et pour -27 on aura 27

Code : Tout sélectionner

a= -27
Debug a
a=  (~a) +1
Debug a

Bien sur, il faut bien comprendre que l'on est en nombres signés.

L'interprétation des résultats dépend de comment on traite les nombres.

Re: L'inversion binaire : ~

Publié : sam. 26/mars/2016 0:06
par microdevweb
Dommage l'image ne se charge plus, autrement cela semblait intéressent

Re: L'inversion binaire : ~

Publié : sam. 26/mars/2016 0:08
par falsam
microdevweb a écrit :Dommage l'image ne se charge plus, autrement cela semblait intéressent
Je viens de tester à nouveau. Ca fonctionne.

Le lien de l'image se trouvant dans le code : http://www.purearea.net/pb/pics/Fred_2012_2_t.jpg

Re: L'inversion binaire : ~

Publié : sam. 26/mars/2016 8:35
par microdevweb
Autant pour moi Falsam,

Crétin que je suis, je n'avais pas sauver le fichier (PB,PBI) avant de tester......

Joli et utile