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 :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

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 8O

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 :

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"

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

Code : Tout sélectionner

myBool= 1 - myBool

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

Publié : mar. 02/juil./2019 13:48
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.

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 :lol:

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