Partir sur une nouvelle base en VBA

Base 16 &Hexadécimale, suffixe de Long&, concaténation de Hex().

Base 16 &Hexadécimale, suffixe de Long&, concaténation de Hex().


On va avoir besoin d’exprimer l’indice de n° de case de l’échiquier en base 16 pour une nouvelle représentation de l’échiquier optimisée pour le générateur de coups.

La base 16 Hexadécimale

Base 10Base 16Base 2
0 &H0 0000
1 &H1 0001
2 &H2 0010
3 &H3 0011
4 &H4 0100
5 &H5 0101
6 &H6 0110
7 &H7 0111
8 &H8 1000
9 &H9 1001
10 &HA 0010
11 &HB 1011
12 &HC 1100
13 &HD 1101
14 &HE 1110
15 &HF 1111
15 = &HF = 8 * 1 + 4 * 1 + 2 * 1 + 1 soit 1111 en base 2.

La base 16 dite Hexadécimale a comme digit, un chiffre qui peut varier de 0 à 9 puis on utilise les six premières lettres de l’alphabet &HA = 10 à &HF = 15.

Dans la fenêtre d’Exécution immédiate :

? 8 * 1 + 4 * 1 + 2 * 1 + 1

15

Un nombre Hexadécimal n’est qu’une facilité d’écriture pour éviter de manipuler de longue série de zéro et de un en base 2. Comme il n’y a pas de moyen syntaxique en VBA pour représenter un nombre en base 2, on le calcule en utilisant les puissances de 2 avec l’opérateur "^".

? 2^3 * 1 + 2^2 * 1 + 2^1 * 1 + 1 = &HF

True

Un seul digit hexadécimal représente quatre digits en base 2.

C’est pourquoi on a l’habitude de regrouper les digits 1 ou 0 par quatre (nibble) ou huit (byte).

&HF représente 1111 en base 2.

Combinons deux digits hexadécimaux :

? &HF * 16 + &HE

254

? &HFE

254

En VBA le préfixe "&H" collé devant un nombre ou une lettre de "A" à "F" signifie que le nombre est exprimé en base Hexadécimale 16. VBA demande en plus un préfixe "&" devant le "H" sinon on pourrait penser que c’est le nom d’une variable telle que H0FABE.

Syntaxiquement attention de ne pas insérer d’espace blanc séparateur entre "&" et "H".

? & H0FABE

Compile error : Expected : expression. Click OK.

? &H0FABE

-1346


Opérateur "&" pour concaténer deux String et fonction Hex()

Il y a cependant un contexte où on peut avoir un espace blanc séparateur avant et après "&" :

? "&H" & Hex(254)

&HFE

On a concaténé la constante String ’’&H’’ avec le résultat de la fonction Hex(nombre) qui retourne une String.

? Val("&H" + Hex(254))

254

L’opérateur "&" entre deux String est équivalent à l’opérateur de concaténation de chaîne "+" pour ceux qui veulent marquer la différence entre la concaténation de String et l’addition numérique. Val(string) convertit la chaîne représentant un nombre en sa valeur.


Integer vs. Long

Il y a des nombres qui sont mémorables pour les informaticiens :

La valeur max d’un 8-bit (byte) est 255 = 2^8 - 1 = &HFF ’ 2 digits hexa(décimal)

La valeur max d’un 16-bit est 65535= 2^16 - 1 = &HFFFF ’ 4 digits hexa

? Hex(65535)

FFFF

? &HFFFF

-1

Oops, comment retrouver notre valeur 65535 passée comme paramètre à Hex() ?

C’est quoi ce &HFFFF ?

? TypeName(&HFFFF)

Integer

Un Integer est un 16-bit signé entre -32768 et 32767 = 65535 \ 2.

Il faut un type VBA plus grand qu’un Integer pour représenter 65535, la valeur max d’un 16-bit non signé.

Pour en terminer avec le symbole "&", collons le non seulement en début de la constante numérique hexadécimale pour exprimer la base 16 mais également en fin.

? &HFFFF&

65535

? TypeName(&HFFFF&)

Long

"&" en fin d’un nombre décimal ou hexadécimal type le nombre comme un Long.


Extraction du poids fort et du poids faible d’un byte

A partir de la constante &HFE = 254, extraire le poids fort "F" (Most Significant Nibble) et le poids faible "E" (Less Significant Nibble) du byte.

Par calcul arithmétique du poids fort avec la division entière :

? Hex(&HFE \ 16)

F

Par calcul arithmétique du poids faible comme reste de la division :

? Hex(&HFE - (&HFE \ 16) * 16)

E

? Hex(&HFE Mod 16)

E

Voir la discussion sur le Modulo dans Résolution du problème en terme d’équation.

Par extraction de chaîne avec Left() et Right() :

? "MSN=""" + Left(Hex(&HFE), 1) + """ LSN=""" + Right(Hex(&HFE), 1) + """"

MSN=’’F’’ LSN=’’E’’

Notez que pour afficher une double quote, il faut la doubler dans la String VBA.

Pour le calcul du poids faible, la conjonction logique And est plus rapide que le reste de la division ou le modulo :

? Hex(&HFE And &HF)

E

Lire verticalement digit hexa par digit hexa :

FE est le 1er paramètre du And

0F est le 2eme paramètre du And
— 

0E est le résultat du And.

&HF And 0 est toujours nul. On dit que l’on a masqué le poids fort.

&HE And &HF donne toujours le paramètre de gauche soit &HE.


Reconstituer un byte à partir de son poids fort et son poids faible

Concaténation de chaîne :

? Hex(&HF) + Hex(&HE)

FE

Addition numérique :

? Hex(&HF * 16 + &HE)

FE

La multiplication par 16 du poids fort est un décalage (shift) de 4 bits vers la gauche.

&0F = 0000 1111

&F0 = 1111 0000 la séquence du nibble 1111 se retrouve décalée sur la gauche.

Multiplier par 16 = 2^4 consiste donc à injecter quatre zéros binaires (nibble nul) à droite.

La disjonction logique Or est identique à l’addition numérique :

? Hex(&HF * 16 Or &HE)

FE

Lire verticalement digit hexa par digit hexa :

F0 est le 1er paramètre du Or après multiplication de &HF par 16. C’est le poids fort.

0E est le 2eme paramètre du Or. C’est le poids faible.
— 

FE est le résultat du Or.

&HF Or 0 donne toujours le paramètre non nul soit &HF.

0 Or &HE donne donc le paramètre non nul soit &HE.


En conclusion vous connaissez maintenant les principales opérations pour gérer un nombre hexa.

Cherchez à représenter l’échiquier pour optimiser le générateur de coups dans la détection des cases en dehors de l’échiquier particulièrement lors du déplacement d’une pièce à longue portée telle Dame, Tour ou Fou le long d’une rangée, colonne ou diagonale.

Partir du test intuitif sur un échiquier 2D :

? (indFile >= 8) or (indRank >= 8) or (indFile < 0) or (indRank < 0)

et essayez de simplifier cette condition basée sur la colonne et la rangée de la case.

L’index de case est-il hors échiquier ? La case pointée par cet index n’existe t’elle pas ?


Précédent : La Tour sur la feuille de calcul

Suivant : VBA & l’échiquier 0x88

Posté le 16 juillet 2011 par Matt