Petite astuce pour inverser une valeur booléenne.

Sujets variés concernant le développement en PureBasic
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Petite astuce pour inverser une valeur booléenne.

Message par microdevweb »

Bonjour à tous,

Petite astuce pour inverser un booléen.

EDIT

Après plusieurs erreurs de ma part :oops: et avec les divers solutions proposées voici je penses la meilleur alternative

Code : Tout sélectionner

; MEILLEUR SOLUTION
flag.b = #False
Debug flag ;0
flag = flag ! 1
Debug flag ;1
flag = flag ! 1
Debug flag ;0

;EXPLICATION 
; EN BINAIRE 
;FLAG = 00000000  si #FALSE
;FLAG = 00000001  si #TRUE
; 1   = 00000001
; ********************************
; TABLE DE VERITE XOR
; ********************************
; 0 0 -> 0
; 0 1 -> 1
; 1 0 -> 1
; 1 1 -> 0
; *********************************
; DONC
; *********************************
; 00000000 ! 00000001 -> retourne 1
; 00000001 ! 00000001 -> retourne 0
;
; Ce qui est exactement se que l'on voulait
Dernière modification par microdevweb le mer. 03/juil./2019 10:52, modifié 2 fois.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
majikeyric
Messages : 602
Inscription : dim. 08/déc./2013 23:19
Contact :

Re: Petite astuce pour inverser une valeur booléenne.

Message par majikeyric »

Malheureusement dans ton example cela ne marche pas.

le 2nd "debug monbol" retourne -2 (%11111110) et non 0 (#False)

etant donné qu'en PB #True = 1 , le plus simple pour inverser c'est de faire "MonBol ! 1"

Cela aurait marché si #True était egal à 255 mais non...
Avatar de l’utilisateur
cage
Messages : 506
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Petite astuce pour inverser une valeur booléenne.

Message par cage »

Bonjour a tous,

J'aime bien utiliser Bool()

Code : Tout sélectionner

Debug "#False = " + #False ; valeur 0
Debug "#True = " + #True   ; valeur 1

monbol = #False

monbol = Bool(monbol = 0) ; vrai, donc monbol = 1

Debug monbol

monbol = Bool(monbol = 0) ; faux, donc monbol = 0

Debug monbol

monbol = Bool(monbol = 0)

Debug monbol

monbol = Bool(monbol = 0)

Debug monbol
CAGE
■ Win10 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.00 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Petite astuce pour inverser une valeur booléenne.

Message par microdevweb »

@majikeyric,

en effet il change bien en -2 pour le false et 1 pour le true

Dans mes soft cela fonctionne, avec des structures

Code : Tout sélectionner

Structure _strct
  b.b
EndStructure
Global myS._strct
Procedure test()
  If myS\b 
    Debug "True"
  Else
    Debug "False"
  EndIf
EndProcedure

test() ; true

myS\b = ~ myS\b

test() ; flase

myS\b = ~ myS\b

test() ; true
Super bizarre 8O
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
majikeyric
Messages : 602
Inscription : dim. 08/déc./2013 23:19
Contact :

Re: Petite astuce pour inverser une valeur booléenne.

Message par majikeyric »

non ce n'est pas super bizarre, dans ton example, tout ce qui n'est pas egal à 0 est considéré vrai :

Code : Tout sélectionner

if myS\b
debug "True"
...
ce n'est pas la même chose que :

Code : Tout sélectionner

if myS\b = #True
debug "True"
...
(car #True a la valeur 1)

Cependant n'initialisant pas ton booleén, il est à 0 par défaut et le premier appel à test() retourne "False" et non "True"
Avatar de l’utilisateur
GallyHC
Messages : 1703
Inscription : lun. 17/déc./2007 12:44

Re: Petite astuce pour inverser une valeur booléenne.

Message par GallyHC »

Bonjour,

Une autre méthode simple et ajouter un et faire un modulo pour qu'il reste dans la bonne tranche de 0 et 1 (ce qui donne "myBool = (myBool + 1) % 2").

Voila un petit exemple:

Code : Tout sélectionner

myBool = #False

For i = 0 To 100
  myBool = (myBool + 1) % 2
  Debug myBool
Next i
Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Petite astuce pour inverser une valeur booléenne.

Message par Zorro »

comme ça aussi , ça marche ;)

Code : Tout sélectionner


calldebugger
myBool = #False

For i = 0 To 100
  myBool =-mybool+1
  Debug myBool
Next i
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Petite astuce pour inverser une valeur booléenne.

Message par microdevweb »

Bonjour à tous,

Voila j'ai modifier le code principal du post pour avoir un résultat fonctionnel, en effet un not seul ne suffit pas car on inverse tous les bits. Voici donc la solution avec le not combiner à un masque logique

Code : Tout sélectionner

Global flag.b = #True
Debug "initialement = #True"
Debug "Valeur  : "+Str(flag)
Debug "Binaire : "+LSet(Bin(flag),8,"0")
; on inverse : attention un not n'est pas suffisant
;              car on inverserait tous les bits
;              on va le combiner avec un masque logique
flag =  $01 & ~ flag
Debug "On inverse à #False"
Debug "Valeur  : "+Str(flag)
Debug "Binaire : "+LSet(Bin(flag),8,"0")
flag =  $01 & ~ flag
Debug "On inverse à #True"
Debug "Valeur  : "+Str(flag)
Debug "Binaire : "+LSet(Bin(flag),8,"0")

Même solution avec une macro

Code : Tout sélectionner

; Même solution mais avec une macro
Macro iv
  $01 & ~
EndMacro
Global flag.b = #True
Debug "initialement = #True"
Debug "Valeur  : "+Str(flag)
Debug "Binaire : "+LSet(Bin(flag),8,"0")
; on inverse : attention un not n'est pas suffisant
;              car on inverserait tous les bits
;              on va le combiner avec un masque logique
flag =  iv flag
Debug "On inverse à #False"
Debug "Valeur  : "+Str(flag)
Debug "Binaire : "+LSet(Bin(flag),8,"0")
flag =  iv flag
Debug "On inverse à #True"
Debug "Valeur  : "+Str(flag)
Debug "Binaire : "+LSet(Bin(flag),8,"0")
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Petite astuce pour inverser une valeur booléenne.

Message par djes »

Zorro a écrit :comme ça aussi , ça marche ;)

Code : Tout sélectionner


calldebugger
myBool = #False

For i = 0 To 100
  myBool =-mybool+1
  Debug myBool
Next i
Il faudrait tester le plus rapide ;)
Je propose

Code : Tout sélectionner

myBool= 1 - myBool
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Petite astuce pour inverser une valeur booléenne.

Message par Ollivier »

Le plus rapide ?

Code : Tout sélectionner

XORPS
8 quads d'un coup (dira-t-on << en un cycle >> )
Ça doit swaper une toute petite trentaine de gigaoctets par seconde...
Index ancien et exemple.
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Petite astuce pour inverser une valeur booléenne.

Message par Zorro »

en quoi un XOR apporte quelque chose ici ??
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
majikeyric
Messages : 602
Inscription : dim. 08/déc./2013 23:19
Contact :

Re: Petite astuce pour inverser une valeur booléenne.

Message par majikeyric »

0 xor 1 = 1
1 xor 1 = 0

une inversion de bit est surement plus rapide qu'une soustraction
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Petite astuce pour inverser une valeur booléenne.

Message par djes »

Non, ce sont des instructions de base. Elles sont câblées (pas de microcode) et équivalentes. L'une des bibles (que je n'ai pas lue) https://www.agner.org/optimize/
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Petite astuce pour inverser une valeur booléenne.

Message par Zorro »

majikeyric a écrit :0 xor 1 = 1
1 xor 1 = 0
haa oui .. quel idiot :lol:

c'est devenu pour moi tellement une façon d'encoder , que j'en ai completement oublié
sa fonction premiere ..
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Petite astuce pour inverser une valeur booléenne.

Message par microdevweb »

Oui le Xor peut être une solution

Code : Tout sélectionner

flag.b = #False
Debug flag ;0
flag = flag ! %00000001 
Debug flag ;1
flag = flag ! %00000001 
Debug flag ;0
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Répondre