|
Site |
Cours VB.net |
|
|
|
Les bases binaires, hexadécimales, algèbre de Boole. |
|
|

Mr Georges Boole 1805-1864
Introduction.
Notion théorique: l'algèbre de Boole.
Les bases.
Le Bit, poids d'un bit.
Conversion décimal binaire.
L'octet, Kilo, Méga, Téra-Octet
Opération: L'addition, la multiplication binaire, les nombres négatifs.
Table de vérité.
Fonction logique. Or And, Not, Xor...
Notation.
Ordre des évaluations.
Loi de composition.
Déplacement de bit.
Hexadécimale.
Intérêts en Visual Basic.
A notre disposition Boolean, Integer Byte..
Conversion binaire, décimale, hexadécimale.
Cas particulier: If A then
Les masques de bit
Cryptage par Xor
Travail sur les couleurs, graphiques..
Exemple de programme.
Viewer hexadécimal.
Changement de base
Ultra Edit.
Introduction:
L'algèbre de Boole est la partie des mathématiques, de la logique de l' électronique et de l'informatique qui s'intéresse aux opérations et aux fonctions sur les variables logiques. En logique propositionnelle, une expression est soit vraie soit fausse. (le vrai (1) et le faux (0)).
Georges Boole (1815-1864), physicien Anglais définit en 1847 un algèbre qui est applicable au raisonnement logique, qui traite des fonctions à variables binaires (deux valeurs). Mais il ne s'applique pas aux systèmes à plus de deux états d'équilibre.
Une variable booléenne, ou logique, ou binaire ne prend que deux valeurs (elle est généralement stockée sous la forme d'un bit).
Vers la fin des années 30, Claude Shannon démontra qu'à l'aide d'interrupteurs fermés pour « vrai » et ouverts pour « faux » il était possible d'effectuer des opérations logiques en associant le nombre 1 pour « vrai » et 0 pour « faux ».
Ce codage de l'information est nommé base binaire. C'est avec ce codage que fonctionnent les ordinateurs. Il consiste à utiliser deux états (représentés par les chiffres 0 et 1) pour coder les informations.
Il permet d'étudier les circuits logiques.
Notions théoriques:
Notion de base:
On utilise diverses bases dans la vie courante:
Pour les heures, minutes, secondes on utilise sans le savoir une base 'soixante':
60 secondes= 1 minute
60 minutes = 1 heure
Si je compte : 1 s, 2s, 3s,...59s, 1mn, 1mn+1 s.....1mn+59s, 2 minutes....59 mn+ 59s, 1h...
En base décimale, on a à notre disposition les caractères 1 2 3 4 5 6 7 8 9.
Si on veut représenter le nombre au dessus de 9, comme on n'a plus de caractère, on recommence avec 1 mais en le décalant vers la gauche pour signifier qu'il s'agit d'une dizaine. On obtient '10'. Le nombre suivant est '11' puis "12'.. Idem pour 100, 1000..
En base binaire, on n'a que le caractère 1 (et le zéro), 1 binaire= 1 décimal.
Si on veut écrire en binaire le nombre au dessus de 1, comme on n'a plus de caractère, on procède de même en décalant vers la gauche le 1:
10 binaire= 2 décimal.
Le nombre suivant est 11 binaire (3 en décimal).
Puis 100 (4 en décimal) car il faut de nouveau décaler.
En base hexadécimale, on a à notre disposition les caractères 1 2 3 4 5 6 7 8 9 A B C D E F.
Aussi 10 décimal = A en hexadécimal
...
15 décimal = F en hexadécimal
16 décimal = 10 en hexadécimal
Si on veut représenter le nombre au dessus de 15, comme on n'a plus de caractères, on recommence avec 1 mais en le décalant vers la gauche pour signifier qu'il s'agit d'une 'seizaine'. On obtient '10' hexadécimal qui correspond à 16 décimal . Le nombre suivant est '11' puis "12' jusqu'a 1F puis 100... 1000..
Utilisons l'analogie des allumettes et des paquets d'allumettes:
En décimal on a des paquets de 10 allumettes.
On compte 1 ,2 ,3..9, 1 paquet de 10, puis 1 paquet + 1 allumette...
On a des gros paquets de 100, des énormes paques de 1000 allumettes..
En binaire on a des paquets de 2 allumettes et des gros paquets de 4 allumettes.
On compte 1 , 1 paquet de 2, puis 1 paquet + 1 allumette, puis 1 gros paquet de 4...
Donc pour compter en binaire: Binaire Décimal
1 allumette. 1 1
1 paquet de 2 10 2
1 paquet de 2 + 1 allumette 11 3
1 gros paquet de 4 100 4
1 gros paquet de 4 +1 allumette 101 5
1 gros paquet de 4 +1 paquet de 2 110 6
....
Le nombre d'allumette qu'il y a dans un paquet se nomme le poids.
En hexadécimal, les paquets sont de 16 allumettes:
On compte 1, 2, 3 ..jusqu'a 15 allumettes puis 1 paquet de 16 puis 1 paquet plus une allumette..
Base binaire:
Soyons maintenant un peu plus scientifique:
Le bit:
Le terme bit (b avec une minuscule) signifie « binary digit », c'est-à-dire 0 ou 1 en numérotation binaire. Il s'agit de la plus petite unité d'information manipulable par un ordinateur.
Physiquement cette information binaire correspond à:
Avec un bit il est donc possible d'avoir deux états :
soit 1,
soit 0.
Grâce à 2 bits, il est possible d'obtenir quatre états différents (2*2) :
On peut avec 2 bits , avoir les valeurs: 0, 1, 10, 11 soit 0,1, 2, 3 en décimal.
| Décimal | |||
| 0 | 0 | 0 | |
| 0 | 1 | 1 | |
| 1 | 0 | 2 | |
| 1 | 1 | 3 |
Avec 3 bits, il est possible d'obtenir huit états différents (2*2*2) de 0 à 7 en décimal:
| En binaire 3 bits | En décimal |
|---|---|
| 000 | 0 |
| 001 | 1 |
| 010 | 2 |
| 011 | 3 |
| 100 | 4 |
| 101 | 5 |
| 110 | 6 |
| 111 | 7 |
Avec 4 bits, il est possible d'obtenir huit états différents (2*2*2*2) de 0 à 15 en décimal:
| En binaire 4 bits | En décimal |
|---|---|
| 0000 | 0 |
| 0001 | 1 |
| 0010 | 2 |
| 0011 | 3 |
| 0100 | 4 |
| 0101 | 5 |
| 0110 | 6 |
| 0111 | 7 |
| 1000 | 8 |
| 1001 | 9 |
| 1010 | 10 |
| 1011 | 11 |
| 1100 | 12 |
| 1101 | 13 |
| 1110 | 14 |
| 1111 | 15 |
Pour un groupe de n bits, il est possible de représenter 2n valeurs( de 0 à 2n-1 ).
Avec 8 bits =256 valeurs.
Avec 16 bits=65536 valeurs.
Avec 32 bits=4294967296 valeurs.
Avec 64 bits=18446744073709551616 valeurs.
Avec 8 bits (un octet) on peut représenter un nombre qui peut avoir 256 valeurs différentes:
de 0 à 255
| binaire 8 bits | décimal |
|---|---|
| 00000000 | 0 |
| 00000001 | 1 |
| 00000010 | 2 |
| 00000011 | 3 |
| ........ | .. |
| ........ | .. |
| 11111110 | 254 |
| 11111111 | 255 |
Poids des bits:
Chaque bits a un poids, qui dépend de la position du bit en partant de la droite. Comme les dizaines, les centaines et les milliers pour un nombre décimal, le poids d'un bit croît d'une puissance de deux en allant de la droite vers la gauche:
| Poids | 27 = 128 | 26 = 64 | 25 = 32 | 24 = 16 | 23 = 8 | 22 = 4 | 21 = 2 | 20 = 1 |
|---|
Remarque : cela est valable pour toutes les bases:
Soit un nombre 'mno' en base b
Le premier chiffre à droite a la valeur: o x b1
Le deuxième chiffre à droite a la valeur: n x b2
Le troisième chiffre à droite a la valeur: m x b3
En allant de la droite vers la gauche le poids croît d'un puissance de b.
Le nombre total est la somme de toutes les valeurs:
o x b1 + n x b2 + m x b3
Conversion:
Pour convertir un nombre binaire en nombre décimal:
Il faut multiplier la valeur de chaque bit par son poids, puis d'additionner les résultats.
Ainsi, le mot binaire 10101 vaut en décimal :
24x1 + 23x0 + 22x1 + 21x0 + 20x1 = 16x1 + 8x0 + 4x1 + 2x0 + 1x1 = 21
Pour convertir un nombre décimal en nombre binaire:
-Méthode des poids:
Soit 21 en décimal.
Il faut connaître les poids (puissance de 2): 2, 4, 8, 16 ,32..
Trouver le premier poids (la première puissance de 2) inférieur au nombre décimal 21 :c'est 16
16 donne en binaire 10000
Faire 21-16 =5
Trouver le premier poids inférieur au nombre 5, c'est 4.
4 donne en binaire 100
Faire 5-4= 1
Quand on atteint 1 (ou 0) on s'arrête.
On additionne 10000
+ 100
+ 1
_____
10101
-Méthode des divisions par 2:
21 /2 = 10 reste 1
10 /2 = 5 reste 0
5 /2 = 2 reste 1
2 /2 = 1 reste 0
1 /2 = 0 reste 1
On prend les restes en commençant par la fin: 10101
Y a t-il une solution plus élégante?
La calculette Windows permet les conversions.
Octet, Kilo méga Téra Octet.
L'octet (en anglais Byte ou B) est une unité d'information composée de 8 bits ( 256 valeurs possibles). Il permettait par exemple de stocker le code d'un caractère (une lettre ou un chiffre: 65 indiquant 'A' dans le code ASCII). Il y a quelques années les ordinateurs fonctionnaient avec des octets puis ils ont utilisé 16 bits , 32 bits et maintenant 64 bits. On voit que plus l'unité d'information contient de bits, plus elle pourra contenir des grands nombres.
En informatique, si 8 bits correspond à un octet (Byte), 16 bits est généralement appelée mot (en anglais word), 32 bits correspond à un mot double (en anglais double word, d'où l'appellation dword).
En Visual Basic.Net, les entiers (Integer) sont codés sur 32 bits, les Long sur 64 bits. Les valeurs sont signées (positive ou négative), un bit est donc utilisé pour le signe. Par contre UInteger est un entier non signé codé sur 32 bits pouvant donc prendre les valeurs 0 à 4 294 967 295.
Ko, Mo, Go, To ( kB, MB, GB, TB en anglais)
Pour indiquer la capacité d'une mémoire, on utilisait:
Cela correspondait bien à des puissances de 2, de plus c'était en accord avec les circuits intégrés de mémoire qui avaient bien 1024 octets dans un Ko.
Il parait que depuis 1998 l'IEC a décidé:
Hors de France, on utilise le nom de « byte » plutôt que le terme « octet ». Cela donne les kilobyte, mégabyte, gigabyte et terabyte : (kB, MB, GB, TB avec un B majuscule)
Ne pas confondre Byte B (octet)
et bit (bit ou binary digit).
Opérations:
Addition binaire:
L'addition en binaire se fait comme en décimale :
0+1 = 1
1+0 = 1
0+0 = 0
1+1 =10
Pour plusieurs digits, on additionne en commençant par les bits de droite. On
a des retenues lorsque la somme de deux bits de même poids dépasse la valeur de
l'unité la plus grande (dans le cas du binaire : 1), cette retenue est reportée
sur le bit de poids plus à gauche...
C'est ce qui se passe avec 1+1= 10
Autre exemple:
| 0 | 1 | 1 | 0 | 0 | |
| + | 0 | 1 | 1 | 1 | 0 |
| - | - | - | - | - | - |
| 1 | 1 | 0 | 1 | 0 |
Soustraction binaire:
La soustraction en binaire se fait comme cela :
100
- 010
_____
010
Mais pour les processeurs il est plus facile d'additionner le complément à 2.
Le complément à 1 c'est le fait d'inverser tous les bits du nombre sur toute sa longueur.
010 donne le complément à 1 suivant: 11111101
(si on travaille sur des octets, on inverse les huit bits)
Le complément à 2, c'est le complément à 1 +1: 11111101+1=11111110
Ajoutons 00000100 à 11111110 cela donne bien 00000010
(la dernière retenue tombe dans le vide)
La table de multiplication en binaire est très simple :
La multiplication se fait en formant un produit partiel pour chaque digit du multiplicateur (seuls les bits non nuls donneront un résultat non nul). Lorsque le bit du multiplicateur est nul, le produit partiel est nul, lorsqu'il vaut un, le produit partiel est constitué du multiplicande décalé du nombre de positions égal au poids du bit du multiplicateur.
Par exemple :
| 1 | 1 | 0 | 1 multiplicande | ||
| x | 0 | 0 | 1 | 0 multiplicateur | |
| - | - | - | - | - | - |
| 0 | 0 | 0 | 0 | ||
| 1 | 1 | 0 | 1 | ||
| 0 | 0 | 0 | 0 | ||
| - | - | - | - | - | - |
| 1 | 1 | 0 | 1 | 0 |
On constate que pour multiplier un nombre par 2, il faut le décaler d'un bit à gauche.
10 binaire multiplié par 2 est égal à 100 (2 x 2=4 en décimal)
Nombres négatifs
On peut utiliser des nombres non signés (contenant une valeur absolue), dans un octet il peut y avoir 256 valeurs (0 à 255)
On peut utiliser des nombres signés (positif ou négatif), on 'code' les nombres négatifs en complément à 2:
Le complément à 1 c'est le fait d'inverser tous les bits du nombre sur toute sa longueur.
010 donne le complément à 1 suivant: 11111101 sur un octet
(si on travaille sur des octets, on inverse les huit bits)
Le complément à 2, c'est le complément à 1 +1: 11111101+1=11111110
On se rend compte que le premier bit à gauche est à 1 pour les nombres négatifs. Dans ce cas on ne peut plus coder que 128 valeurs (sur 7 bits) pour un octet signé.
Table de vérité:
Une table de vérité est un tableau permettant de décrire toutes les possibilités de sorties en fonction des entrées. On place donc les variables d'entrées dans les colonnes de gauche en les faisant varier. La colonne (ou les colonnes si la fonction a plusieurs sorties) de droite décrit le résultat.
Exemple de table de vérités de la multiplication.
| Entrée | Sortie | ||
|---|---|---|---|
| A | B | S |
|
| 0 | 0 | 0 |
|
| 0 | 1 | 0 |
|
| 1 | 0 | 0 |
|
| 1 | 1 | 1 |
|
L'expression logique correspondante est S= A X B
On retrouve bien par exemple: si les 2 entrées sont 1 et 1 la sortie est 1: en d'autres termes 1 X 1 =1
Exemple des tables de vérités des fonctions logiques:
| Entrée | Sortie | ||
|---|---|---|---|
| A | B | S |
|
OR |
0 | 0 | 0 |
| 0 | 1 | 1 |
|
| 1 | 0 | 1 |
|
| 1 | 1 | 1 |
|
AND |
0 | 0 | 0 |
| 0 | 1 | 0 |
|
| 1 | 0 | 0 |
|
| 1 | 1 | 1 |
|
XOR |
0 | 0 | 0 |
| 0 | 1 | 1 |
|
| 1 | 0 | 1 |
|
| 1 | 1 | 0 |
|
NOT |
0 |
1 |
|
1 |
0 |
||
Pour la fonction And par exemple, l'expression logique correspondante est S= A AND B si les 2 entrées sont 1 et 1 la sortie est 1: en d'autres termes 1 And 1 =1
Comment écrire une fonction logique à partir d'une table de vérité:
Il est possible à partir de la table de vérité d'une fonction
d'écrire l'expression algébrique de celle-ci.
Exemple 1:Soit la table de vérité suivante:
| Entrée | Sortie | |
|---|---|---|
| A | B | S |
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
La sortie vaut 1 lorsque A vaut 1 et B vaut 0, l'expression logique de cette fonction est donc:
S=A AND NOT B
Exemple 2: Soit la table de vérité suivante:
| Entrée | Sortie | |
|---|---|---|
| A | B | S |
| 0 | 0 | 1 |
| 0 | 1 | 0 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
La sortie vaut 1 lorsque A vaut 1 et B vaut 0 ou lorsque A et B sont à 0, l'expression logique de cette fonction est donc:
S=(A And Not B) Or (Not A And Not B)
En conclusion:
On écrit donc les expressions pour chaque sortie à 1 (avec des And), on les combine avec des Or
Fonction logique:
Elle est définie de la manière suivante : a And b est égal à 1 si et seulement si a est égal à 1 et b est égal à 1.
On peut construire la table.
| Entrée | Sortie | ||
|---|---|---|---|
| A | B | S |
|
AND |
0 | 0 | 0 |
| 0 | 1 | 0 |
|
| 1 | 0 | 0 |
|
| 1 | 1 | 1 |
|
Elle est définie de la manière suivante : a Or b est égal à 1 si et seulement si a est égal à 1 ou b est égal à 1. (notons que si a est égal à 1 et que b est égal à 1 aussi, alors a OU b est égal à 1.)
On peut construire la table:
| Entrée | Sortie | ||
|---|---|---|---|
| A | B | S |
|
OR |
0 | 0 | 0 |
| 0 | 1 | 1 |
|
| 1 | 0 | 1 |
|
| 1 | 1 | 1 |
|
Le contraire de "a" égal à 1 si et seulement si a est égal à 0. Le contraire de a est noté Not a
| Entrée | Sortie | |
|---|---|---|
| A | S |
|
NOT |
0 |
1 |
1 |
0 |
Elle est définie de la manière suivante : a Xor b est égal à 1 si et seulement si a est égal à 1 ou b est égal à 1 mais pas les deux. (notons que si a est égal à 1 et que b est égal à 1 aussi, alors a Xor b est égal à 0.)
On peut construire la table:
| Entrée | Sortie | ||
|---|---|---|---|
| A | B | S |
|
XOR |
0 | 0 | 0 |
| 0 | 1 | 1 |
|
| 1 | 0 | 1 |
|
| 1 | 1 | 0 |
|
« l'un ou l'autre mais pas les deux ».
a Xor b Xor b = a : si on applique sur a 2 fois Xor b, on retrouve a. C'est une propriété très utilisée.
L'équivalence (notée =) est vraie si les deux entrées ont la même valeur et faux sinon. Elle se compose comme suit :
On peut aussi dire que :
| a | b | a = b |
| 0 | 0 | 1 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
+ (addition) équivalent à Or
. (produit) équivalent à And
- au dessus (négation) équivalent à Not
Les parenthèses modifient l'ordre des opérations: elles sont prioritaires sur tous:
a And (b Or c) = 0
En VB, compte tenu que les opérateurs logiques et de bits ont une priorité inférieure à celle des opérateurs arithmétiques et relationnels, toutes les opérations au niveau du bit doivent être mises entre parenthèses afin de garantir une exécution précise.
Sur un groupe de bit les opérations s'effectuent bit à bit:
Exemples:
15 décimal 00001111
4 décimal 00000100
15 And 4 = 00000100 --->4 décimal
4 décimal 00000100
2 décimal 00000010
4 Or 2 = 00000110 --->6 décimal
Les lois de composition:
Ce sont des règles logiques qui permettent de simplifier l'écriture des expressions algébriques.
Associativité:
Absoption:
Commutativité:
Distributivité:
Mais aussi:
Identité:
Nullité:
Not( a And b)équivalent à Not a Or Not n
Les expressions complexes peuvent donc être simplifiées en utilisant des transformations:
|
Originale
|
Transformation
|
|
Not A And Not B
|
Not (A Or B)
|
|
Not A And B
|
Not (A Or Not
B)
|
|
A And Not B
|
Not (Not A Or
B)
|
|
A And B
|
Not (Not A Or
Not B)
|
|
Not A Or Not B
|
Not (A And B)
|
|
Not A Or B
|
Not (A And Not
B)
|
|
A Or Not B
|
Not (Not A And
B)
|
|
A Or B
|
Not (Not A And
Not B)
|
Ils existaient en VB6!!
L'implication (notée IMP) qui n'existe pas en VB.Net s'écrit de la manière suivante :
a IMP b peut s'écrire en VB: Not(a) Or b
Cette opération n'est pas commutative a est une condition suffisante pour b, qui, elle, est une condition nécessaire pour a.
| IMP | ||
| a | b | a IMP b |
| 0 | 0 | 1 |
| 0 | 1 | 1 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
L'inhibition (notée INH) n'existe pas en VB.Net, elle se compose comme suit :
Cette opération n'est pas commutative.
| INH | ||
| a | b | a And Not b |
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
Déplacement de bit:
Les opérateurs binaires << et >> effectuent des opérations de déplacement de bits.
L'opérateur << décale à gauche les bits du premier opérande du nombre de positions spécifié. Les bits de poids fort situés en dehors de la plage du type de résultat sont éliminés, et les positions libérées par les bits de poids faible sont remplies par des zéros.
L'opérateur >> décale à droite les bits du premier opérande du nombre de positions spécifié. Les bits de poids faible sont éliminés et, si l'opérande de gauche est positif, les positions libérées par les bits de poids fort sont mises à zéro ; s'il est négatif, elles sont mises à un. Si l'opérande de gauche est de type Byte, les bits de poids fort disponibles sont remplis par des zéros.
A quoi cela sert?
Exemple décaler à gauche un Byte revient à faire une multiplication par 2.
3 en décimal= 11
Je décale à gauche, j'obtient 110 , c'est 3*2=6 en décimal.
Revenons sur la base hexadécimale:
En hexadécimal:
On a 16 caractères: 0, 1, 2, 3 ,4 ...8, 9, A, B, C, D, E, F.
Quand on compte et qu'on arrive à F (15 décimal), on passe à 10 (16 décimal) puis 11...
Voyons la correspondant décimale, hexadécimale, binaire:
| Base décimale | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| Base hexadécimale | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
| Base binaire | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 |
Pour un nombre hexadécimal à plusieurs chiffres le poids de chaque chiffre est:
| Poids en décimal : | 163 | 162 | 161 | 160 |
| Nombre hexadécimal: | 1000 | 0100 | 0010 | 0001 |
1C en base 16 c'est donc 10+C en hexadécimal = en décimal c'est 161 + 12x 160 = 16 + 12 = 28
Le nombre 28 (en base 10) vaut en base 16 : 1*161
+ 12*160 = 1*161 + C*160
c'est-à-dire 1C en base 16.
Le nombre FB4 (en base 16) vaut en base 10 : F*162 + B*161 + 4*160 = 3840 + 176 + 4 = 4020
A quoi sert la base hexadécimale?
C'est une représentation plus imagée de la représentation binaire:
Pour convertir un octet en hexadécimale, on le partage en 2 groupes de 4 bits, qui correspondent chacun à un chiffre hexadécimal.
00101010 c'est un octet en binaire; impossible à retenir en binaire (en décimal on ne voit pas du tout ce qu'il représente en bits). Cet octet, on le coupe en 2 , chaque demi-octet représente 4 bits dont la valeur est comprise entre 0 (0000 en binaire) et F (1111 en binaire, 15 en décimal)
00101010 en binaire= 2A en hexadécimal.
| 2 | A |
| 0010 | 1010 |
Il suffit de se souvenir des nombres de 1 à 15 en binaire pour se représenter rapidement 2A.
Autre exemple:
| D | 5 |
| 1101 | 0101 |
HFF = 255 décimal
HFFFF=65535 décimal
Notons que pour signifier qu'on a affaire à un nombre hexadécimal, on ajoute H devant.
L'hexadécimal est donc une manière rapide et mnémotechnique de se représenter des nombres binaires.
Les viewers et éditeurs permettant de voir et modifier les octets contenues dans un fichier affichent les octets en hexadécimal. (voir plus bas)
Pratique en Visual Basic.
En Visual Basic.Net, on a à notre disposition
Les Boolean qui peuvent prendre les valeurs True ou False..
Les entiers: Byte contient 8 bits (non signé) pouvant prendre les valeurs 0 à 255: il existe aussi en VB 2005, SByte contenant un octet signé dont les valeurs varient de moins 128 à plus 127.
Les Short 16 bits, les Integer sont codés sur 32 bits, les Long sur 64 bits. Ces valeurs sont signées (positives ou négatives), un bit est donc utilisé pour le signe.
Par contre en VB 2005, UInteger est un entier non signé codé sur 32 bits pouvant donc prendre les valeurs 0 à 4 294 967 295. Ushort et ULong existent aussi. (U comme Unsigned)
Il existe aussi les nombres en virgule flottante ou fixe ( Single, Double, Decimal), ceux là, on ne les utilisera pas pour travailler sur les bits.
Littéral
Un littéral est sensé être en base décimal .
Dim A As Integer = 12 (12 est en base décimale)
On peut forcer un littéral a être un hexadécimal ou un octal: Un nombre hexadécimal est noté avec le préfixe &H , exemple :
A=&HFF 'A contiendra 255
(&O pour octal)
Il n'est pas possible de saisir un littéral en binaire.
Bien comprendre que, en interne, les entiers sont codés en binaire: c'est normal, la mémoire de l'ordinateur et les registres des processeurs sont composés d'octets de 8 bits de Dword de 16 bits et maintenant de 32 et 64 bits contenant des bits positionnés à 0 ou 1.
Dim A As Integer = 12
c'est 12 est en base décimale, c'est notre manière de l'utiliser.
mais c'est 0000000000001100 en mémoire physique, représentation binaire.
c'est 000C en hexadécimal, mais dans une autre base plus pratique, "plus imagée".
C'est toujours le même nombre!!
And Or Xor AndAlso, OrElse
En VB, en plus de And, Or, Xor, existent AndAlso et OrElse qui testent la première valeur puis, si nécessaire, la seconde. Si la seconde valeur n'a pas à être évaluée, est ne le sera pas, c'est un gain de temps.
Pourquoi Xor n'a pas d'équivalent?
Car pour évaluer Xor, il faut d'emblée utiliser les 2 valeurs.
Comment VB fait avec les Booléens, les entiers?
Si A et B sont des expressions Booléens (valeur True ou False uniquement):
IF A>=2 And A<=5 Then..
Les expressions booléennes sont évaluées et on a comme résultat True ou False.
L'opération est effectuée sur chaque bit de l'équivalent binaire, le résultat binaire est affiché en décimal.
A = 7 'en décimal ( 0111 en binaire)
B = 12 'en décimal( 1100 en binaire)
A And B = 4 'en décimal( 0100 en binaire)
Si A et B sont des nombres en virgule flottante (Single, Double par exemple), ils sont codés sous la forme de mantisse plus exposant, une opération logique devrait produire un résultat aberrant. Ils sont convertis en Long avant évaluation si Option Strict= Off:
Un conseil: utiliser des Booléens quand vous voulez effectuer des opérations logiques, des entiers quand vous travaillez sur les bits.Dim
a As Single = 7 Dim b As Single = 12 Dim c As Boolean = TrueMsgBox(a
And b) 'affiche '4' car 7 et 12 sont transformés en Long (si Option Strict=Off)si Option Strict=On Levée d'une exception.
![]()
Conversion Binaire, hexadécimale, décimal:
L'affichage d'un entier se fait en décimal par défaut si on utilise la méthode ToString:
Dim a As Integer =&HFF Littéral en hexadécimal
MsgBox (a.ToString) Affiche '255' décimal
On peut surcharger la méthode et afficher en hexadécimal:
Dim
a As Integer = 255MsgBox(a.ToString(
"X")) Affiche 'FF'On peut afficher en hexadécimal et décider le nombre de digit affiché:
Dim
a As Integer = 255MsgBox(a.ToString(
"X4")) Affiche '00FF'
En utilisant la classe Convert, on peut même afficher en base binaire, octale, décimal, hexadécimal.
Convert.ToString(Int64, base) Convertit la valeur d'un entier signé 64 bits en sa représentation String équivalente dans une base 'base' spécifiée (base 2, 8, 10, 16).
d As Long = 3Dim
Dim r As String
r= Convert.ToString(d, 2)) 'convertit la valeur Long de "d" en base 2
d= 3 donne r="11" binaire
Si on avait eu une String "3" on l'aurait convertie en Long grâce à CLng(d)
Convert.ToInt64(s, base) 'convertit en type int64(long en base 10) la valeur de la String 's' à partir d'une base 'base'.
d As String = "111"Dim
Dim r As Long
r= Convert.ToInt64(d, 2)) 'convertit d (string représentant un binaire) en Long
cela donne r=7
Enfin dans l'espace Visual Basic l'instruction Hex donne la représentation hexadécimale d'un nombre , ( Oct existe aussi)
str=Hex(456) retourne 1CB
Conversion String en Byte:
Conversion String en Bytes:
Dim str As String= ".."
Dim encoding As New System.Text.ASCIIEncoding()
Dim Bytes() As Byte()= encoding.GetBytes(str)
Conversion Bytes en String:
Dim Bytes As Byte() = ...
Dim str As String
Dim enc As New System.Text.ASCIIEncoding()
str = enc.GetString(Bytes)
Enregistrement d'un tableau de Bytes:
Débutant s'abstenir.
1 - En mémoire: (dans un mémoryStream)
Imports System.IO
...
' Creation d'un tableau de
Byte.
Dim dataArray(1000) As Byte
' On le remplit avec
des nombres aléatoires.
Dim randomGenerator As New Random
randomGenerator.NextBytes(dataArray)
Ecriture
Dim binWriter As New BinaryWriter(New
MemoryStream())
' Ecrire les données dans la
mémoire.
binWriter.Write(dataArray)
Lecture
' Créer un reader en utilisant
le stream du Writer
Dim binReader As New BinaryReader(binWriter.BaseStream)
' mettre la position au début
du stream.
binReader.BaseStream.Position = 0
' Relecture dans verifyArray.
Dim verifyArray() As Byte =
binReader.ReadBytes(dataArray.Length)
2 - Dans un fichier:
...
Dim fs As New FileStream(FILE_NAME, FileMode.CreateNew)
Dim w As New BinaryWriter(fs)
w.Write(datArray)
w.Close()
fs.close
Le Framework 2 permet une écriture encore plus simple pour lire écrire les octets d'un fichier:
Lire et mettre dans un tableau les octets d'un fichier? (Framework 2)
Dim myBytes() As Byte =File.ReadAllBytes("c:\monText.txt")
Il existe aussi WriteAllByte.
Précision sur 'If a Then'
Avec des valeurs numériques si
Donc
Dim a As Integer =15
If a Then..
C'est une mauvaise méthode!! Il vaut mieux écrire
Dim a As Integer =15
If a <>0 Then..
Avec une expression Booléenne par contre, on peut écrire:
Dim a As Boolean= True
If a = True Then..
ou
If a Then..
Exemple:
If (x=15)=True Then..
ou If x=15 Then...
Avec une expression booléenne, et uniquement avec une expression booléenne, il est possible de se passer du = True après un If car de toutes façons , l'expression est évaluée.
Masque de bit:
Or permet d'écrire un bit à 1:
Soit un entier, on veut forcer un des bits à 1 , la solution est de faire un Or avec un entier ayant ce seul bit à 1.
Exemple : Mettre le deuxième bit de 00000100 (4 en décimal) à 1
Il faut faire un Or avec 00000010.
Le poids du deuxième bit est 2, c'est le 'mask bit'.
4 Or 2 = 6
00000100 Or 00000010 = 00000110
En faisant Or 2, on a bien mis le deuxième bit à 1.
Le masque est toujours une puissance de 2.
Or 8 met le quatrième bit à 1
And permet de tester un bit
A And 1 indique si le bit le moins significatif (le plus à droite) est a 1
Exemple: si A = 7 'en décimal ( 0111 en binaire) A And 1 retourne 1
A And 8 indique si le quatrième bit est a 1 (8 est le poids du quatrième bit).
Exemple: si A = 7 'en décimal ( 0111 en binaire) A And 8 retourne 0
8 c'est le 'mask bit' (00001000) du quatrième bit.
A And 8 peut ensuite être évalué comme une expression booléenne:
If A and 8 Then ' Si le quatrième bit de A est à 1 alors,
And permet aussi de forcer à 0 une partie des bits et de ne conserver que la valeur de certains bits:
Soit une couleur codée sur 24 bits; les 8 bits à droite code la composante bleu, Je veux conserver uniquement ces 8 bits de droite (l'octet de droite):
myColor And &HFF
conserve le premier octet mais met les 2
autres à 0:
MyColor=0010
0100 1000 0010
0010 0000
And 0000 0000 0000 0000 0000 1111
= 0000
0000 0000 0000
0010 0000
Le masque correspond au bits à conserver.
Xor permet de forcer un bit à 0
Pour mettre le 4eme bit à 0:
Il faut faire un Xor avec 00001000.
Le poids du deuxième bit est 2, c'est le 'mask bit'.
12 Xor 8 = 4
00001100 Or 00001000 = 00000100
Exemple pratique:
Comment stocker plusieurs valeurs dans une variable en utilisant un masque.
Souvent, plutôt que de coder une information par octet, on peut coder une information par bit et ainsi coder 8 informations par octet.
Le paramètre d'une fonction est, par exemple, composé d'un entier ou chaque bit à une signification.
Exemple fictif :
00000001 le premier bit à 1 signifie gras (1 en décimal)
00000010 le deuxième bit à 1 signifie l'italique (2 en décimal)
00000100 le troisième bit à 1 signifie le soulignage. (4 en décimal)
Si je veux envoyer les paramètres gras et souligné, j'enverrais le paramètre 1 Or 4 qui correspond a 00000101. Les bits 1 et 3 sont bien à 1.
On note bien que chaque paramètre doit être une puissance de 2.
C'est plus clair de créer une énumération:
<Flags()> Enum Car
Normal=0
Gras= 2
Italique= 4
Souligne= 8
End Enum
Si je veux envoyer les paramètres gras et souligné, j'enverrais le paramètre Car.Gras Or Car.Souligne
<Flags()> indique qu'on travaille bien sur des bits.
Souvent les valeurs sont proposées par VB, comme par exemple quand on utilise MsgBox; le deuxième paramètre qui indique le style peut comporter plusieurs indications séparées par des Or:
reponse= MsgBox(msg, MsgBoxStyle.DefaultButton2 Or MsgBoxStyle.Critical Or MsgBoxStyle.YesNo, Title)
Pour lire un bit en retour d'une fonction, on utilisera And:
Si reponse And Car.Italique =1 c'est que le second bit de reponse est à 1.
Bien que ce soit une opération sur les bits on écrit souvent:
If reponse And Car.Italique Then...
Cryptage simple par Xor
La technique la plus simple est d'appliquer un « OU exclusif » (XOR) entre le texte à chiffrer et la clé.
Pour obtenir le message crypté on effectue Message Xor Cle (si la clé fait x octets on effectue le Xor entre le premier octet du message et le premier de la clé, puis le deuxième.. quand on arrive à x+1 caractère du message, on recommence au premier caractère de la clé).
Comme Message Xor Cle Xor Cle =Message, pour déchiffrer le message codé, il suffit de faire de nouveau un Xor avec la clé.
La clé est donc la même pour coder et décoder, on appelle cela une clé symétrique.
Bien sur, si on utilise un texte comme clé et comme message, c'est le code du caractère qui est utilisé.
Travail sur les couleurs:
Les valeurs RVB (couleurs) sont stockées dans trois octets de 8 bits, conduisant à une couleur à 24 bits, chaque octet correspondant respectivement au rouge, au vert et au bleu.
rrrr rrrr vvvv vvvv bbbb bbbb
Comment récupérer la composante rouge verte ou bleue?
Dim myColor As Integer = 15963245
'Un Integer a 32 bits , les 24 premiers sont utilisés.
Dim R, V, B As Byte
Pour le rouge:
R = myColor >> 16
On décale de 16
bits vers la droite: 0000 0000 0000 0000
rrrr rrrr
Pour le vert:
V = (myColor And &HFF00) >> 8
On fait un And &HFF00 ce qui met le
premier et le troisième octet à 0
0000 0000
vvvv vvvv
0000 0000
On décale de 8
bits vers la droite: 0000 0000 0000 0000
vvvv vvvv
Pour le bleue:
B = (myColor And &HFF)
On fait un And &HFF ce qui met le
premier et le second octet à 0
0000 0000 0000
0000
bbbb bbbb
(En Vb on peut faire plus simple)
Travail sur les graphiques:
Un mode souvent utilisé pour la réalisation d'interfaces est le mode XOR. Ce mode permet d'effacer facilement un cadre de sélection en le redessinant une seconde fois à la même position.
Si l'on a un écran noir et blanc pour lequel 1 = noir et 0 = blanc et que l'on affiche une forme en noir, chaque pixel appartenant à la forme est inversé à l'écran puisque 1 xor p = not p. Donc si l'on dessine la forme deux fois, chaque pixel est inversé deux fois et revient donc dans son état initial.
Par contre, sur un écran couleur, les résultats sont imprévisibles. Si le noir est représenté par la valeur de pixel 1111 et que l'on dessine en xor sur un pixel de valeur 1001, le résultat est un pixel de valeur 1111 xor 1001 = 0110. La couleur résultante est alors imprévisible : on obtient un effet "technicolor".
En VB on a d'autres fonctions sur les graphiques.
Viewer hexadécimal:
Comment voir le contenu d'un fichier en hexadécimal?
C'est très simple et VB 2005:
On utilise un composant ByteViewer fourni par Microsoft dans une Dll.
Charger la référence System.design.Dll
Puis entrer le code dans Form_Load:
Private
Sub Form1_Load() Dim viewer As New System.ComponentModel.Design.ByteViewer()Dim
viewer As New System.ComponentModel.Design.ByteViewerMe.Controls.Add(viewer)
viewer.Dock = DockStyle.Fill
Dim ofd As New OpenFileDialog 'Choix d'un fichier
If ofd.ShowDialog() = Windows.Forms.DialogResult.OK Then viewer.SetFile(ofd.FileName)
End Sub
Si vous avez déjà un tableau de bytes, utilisez sa méthode SetBytes .
Vous pouvez même choisir son mode d'affichage (Ansi, Unicode, Hexadump ou automatique) avec sa méthode SetDisplayMode.
Second exemple:
Ouvrir un fichier image .jpg le charger dans un tableau de Bytes et l'afficher:
Dim
viewer As New System.ComponentModel.Design.ByteViewer Me.Controls.Add(viewer)viewer.Dock = DockStyle.Fill
Dim ofd As New