Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Autres questions


Index du Forum » Autres questions » [BASIC] Optimisation du calcul de xor
Lephenixnoir En ligne Administrateur ★ Points: 25989 Défis: 174 Message

[BASIC] Optimisation du calcul de xor

Posté le 11/11/2026 15:06

Je cherche comment optimiser le calcul de xor entre deux octets en BASIC. À l'origine c'est pour générer les codes d'erreur de QR codes, mais ça pourrait potentiellement servir ailleurs... je suis preneur d'idées.

Il y a bien la commande xor du mode BASE, qu'on peut utiliser en mode normal si on écrit l'opcode direct un g1m avec un éditeur hexadécimal (vu qu'il est pas dans la catalogue et qu'on peut pas copier/coller en mode BASE), mais ces commandes binaires sont leeeentes. Pour vous donner une idée, sur ma Graph 75+E, sans overclock :

For 0→I To 255:Iand255:Next
'7.30 s (!!)

For 0→I To 255:I Rmdr 256:Next
'1.30 s

C'est pas super étonnant dans la mesure où les nombres en BASIC sont stockés en BCD (en base 10) donc les opérations binaires sont pas rapides, mais là c'est vraiment catastrophique.

Du coup je cherche des alternatives arithmétiques. Voilà mon benchmark...

For 1→A To 4
Locate 1,1,A
For 100→I To 115
For 100→J To 115
IxorJ
Next:Next:Next:ClrText
'26.90 s (!!)

Dans la suite, tout reste fixe sauf la ligne IxorJ.

La seule piste qui marche à peu près pour l'instant est de coder la fonction sur 4 bits dans une matrice 16×16 et de recombiner les deux moitiés à la main :

16MatA[1+I Int÷ 16,1+J Int÷16]+Mat A[1+I Rmdr 16,1+J Rmdr 16
'20.10 s

Sachant que MatA[1+I,1+J] = IxorJ, précalculé.

J'ai aussi essayé dans une liste, en espérant que je gagnerais sur le calcul mélangé des indices :

16List 9[1+16(I Int÷ 16)+J Int÷ 16]+List 9[1+16(I Rmdr 16)+J Rmdr 16
'20.76 s

Avec List 9[16I+J] = IxorJ, précalculé.

La variation où les bits du haut sont obtenus par soustraction est plus lente :

16List 9[1+I-(I Rmdr 16)+J Int÷ 16]+List 9[1+16(I Rmdr 16)+J Rmdr 16
'23.20 s

Je suis un peu à court d'idées, je me demandais si y'a pas moyen de tricher avec d'autres fonctions hardcodées, e.g. donner une expression de A xor B comme List 1[A]+List 2[A+B], mais y'a pas de solution pour cette forme-là et je sais pas trop par quel autre bout la prendre.



LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

→ ⇒ √ Σ ∫ ≠ ≥ ≤ π θ ◢ ± α β γ δ Δ σ ≈ ∞ ∈ λ
captcha

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2026 | Il y a 117 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd