L'inversion binaire : ~

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

L'inversion binaire : ~

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: L'inversion binaire : ~

Message par SPH »

C'est pas du negatif ? :P

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: L'inversion binaire : ~

Message 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:
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Fred
Site Admin
Messages : 2805
Inscription : mer. 21/janv./2004 11:03

Re: L'inversion binaire : ~

Message 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:
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: L'inversion binaire : ~

Message par Ar-S »

On a échapé de peu au coincoin pour le logo de PB ? :mrgreen:
Excellent code :)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: L'inversion binaire : ~

Message par kernadec »

bonjour
je remarque aussi que Fred semble très proche de "Michael Vogel" :mrgreen:

Cordialement
Shadow
Messages : 1413
Inscription : mer. 04/nov./2015 17:39

Re: L'inversion binaire : ~

Message 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$
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: L'inversion binaire : ~

Message 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.
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: L'inversion binaire : ~

Message par microdevweb »

Dommage l'image ne se charge plus, autrement cela semblait intéressent
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: L'inversion binaire : ~

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: L'inversion binaire : ~

Message 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
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Répondre