Page 1 sur 2
Petite astuce pour inverser une valeur booléenne.
Publié : dim. 30/juin/2019 9:04
par microdevweb
Bonjour à tous,
Petite astuce pour inverser un booléen.
EDIT
Après plusieurs erreurs de ma part

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
Re: Petite astuce pour inverser une valeur booléenne.
Publié : dim. 30/juin/2019 10:01
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...
Re: Petite astuce pour inverser une valeur booléenne.
Publié : dim. 30/juin/2019 10:42
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
Re: Petite astuce pour inverser une valeur booléenne.
Publié : dim. 30/juin/2019 11:29
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

Re: Petite astuce pour inverser une valeur booléenne.
Publié : dim. 30/juin/2019 11:55
par majikeyric
non ce n'est pas super bizarre, dans ton example, tout ce qui n'est pas egal à 0 est considéré vrai :
ce n'est pas la même chose que :
(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"
Re: Petite astuce pour inverser une valeur booléenne.
Publié : lun. 01/juil./2019 7:40
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
Re: Petite astuce pour inverser une valeur booléenne.
Publié : lun. 01/juil./2019 9:35
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
Re: Petite astuce pour inverser une valeur booléenne.
Publié : mar. 02/juil./2019 6:42
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")
Re: Petite astuce pour inverser une valeur booléenne.
Publié : mar. 02/juil./2019 7:50
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
Re: Petite astuce pour inverser une valeur booléenne.
Publié : mar. 02/juil./2019 13:48
par Ollivier
Le plus rapide ?
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.
Re: Petite astuce pour inverser une valeur booléenne.
Publié : mar. 02/juil./2019 14:43
par Zorro
en quoi un XOR apporte quelque chose ici ??
Re: Petite astuce pour inverser une valeur booléenne.
Publié : mar. 02/juil./2019 18:02
par majikeyric
0 xor 1 = 1
1 xor 1 = 0
une inversion de bit est surement plus rapide qu'une soustraction
Re: Petite astuce pour inverser une valeur booléenne.
Publié : mer. 03/juil./2019 8:00
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/
Re: Petite astuce pour inverser une valeur booléenne.
Publié : mer. 03/juil./2019 8:13
par Zorro
majikeyric a écrit :0 xor 1 = 1
1 xor 1 = 0
haa oui .. quel idiot
c'est devenu pour moi tellement une façon d'encoder , que j'en ai completement oublié
sa fonction premiere ..
Re: Petite astuce pour inverser une valeur booléenne.
Publié : mer. 03/juil./2019 8:26
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