[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.