Site:  Cours VB.net  
8.1 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..

Viewer hexadécimal.

 

 

 

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.

  1. Dans le menu Affichagede la calculette, cliquez sur Scientifique.
  2. Tapez le nombre décimal que vous souhaitez convertir.
  3. Cliquez sur le RadioButton 'Bin' .

 

 

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:

La loi AND, dite conjonction

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

« l'un et l'autre »

La loi OR, dite disjonction ou disjonction inclusive

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

« l'un ou l'autre ou les deux »

 

Le contraire, dite négation

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

 

La loi XOR, dite disjonction exclusive

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 équivalent à  (a Or b) And Not( a And b)

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'opérateur Équivalence

L'équivalence (notée =) est vraie si les deux entrées ont la même valeur et faux sinon. Elle se compose comme suit :

a=b est égal à Not( a Or b) Or ( a And b)

On peut aussi dire que :

    a=b est égal à Not (a Xor b)
a b a = b
0 0 1
0 1 0
1 0 0
1 1 1

 

 

Notons la notation utilisée dans les traités d'algèbre de Boole:

+  (addition) équivalent à Or

.  (produit)  équivalent à And

-  au dessus (négation) équivalent à Not

 

Ordre des évaluations:

Les opérations seront soumises aux mêmes règles que les opérations « de tous les jours », la fonction Not  est prioritaire par rapport à And qui est prioritaire par rapport à la fonction Or, enfin on trouve Xor ; on peut, pour s'aider, placer des parenthèses dans les opérations pour forcer l'ordre des opérations.

Exemple :
Dim a As Boolean = 0 
Dim b As Boolean = 1 
Dim c As Boolean  1
 
On cherche a And b Or c

a And b = 0 
(0 And 1 = 0)
 
0 Or c = 1
(O Or 1 = 1)
 
Le résultat est donc:
 
a And b Or c = 1

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

Inversion:

Nullité:

Théorème de De Morgan

Not (a Or b) est équivalent à  Not a And Not b
Dans les deux cas, l'expression ne sera égale à 1 que si a et b sont = 0.
 

     Not( a And b)équivalent à Not a Or Not n

Dans les deux cas, l'expression ne sera =1 que si a ou b sont =0.

 

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)

 

 

Il existe aussi plusieurs autres opérateurs qui n'ont pas d'équivalent en Visual Basic Net:

Ils existaient en VB6!!

Implication

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

 

Inhibition

L'inhibition (notée INH) n'existe pas en VB.Net, elle se compose comme suit :

 
a INH b peut s'écrire en VB: a And Not(b)

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 réagit VB avec les Booléens, les entiers?

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)

Dim a As Single = 7

Dim b As Single = 12

Dim c As Boolean = True

MsgBox(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.

Un conseil: utiliser des Booléens quand vous voulez effectuer des opérations logiques, des entiers quand vous travaillez sur les bits.

 

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 = 255

MsgBox(a.ToString("X"))  Affiche 'FF'

On peut afficher en hexadécimal et décider le nombre de digit affiché:

Dim a As Integer = 255

MsgBox(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).

Dim d As Long = 3

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

Dim d As String = "111"

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:

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

Comment voir le contenu d'un fichier en hexadécimal?

C'est très simple et VB 2005:

On utilise un composant ByteViewer

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

Me.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 OpenFileDialog

ofd.ShowDialog()

Dim img As Image = Image.FromFile(ofd.FileName)