Dès l'apparition des premiers ordinateurs numériques et de la représentation binaire de l'information, les systèmes de numération sont devenus l'un des fondements essentiels de l'informatique moderne. Toute donnée manipulée par un ordinateur, qu'il s'agisse de textes, d'images, de sons ou de calculs scientifiques, est ultimement représentée sous la forme de nombres exprimés dans une base numérique particulière. Pour cette raison, la conversion entre différentes bases fait partie des opérations mathématiques les plus fondamentales que tout programmeur, analyste ou étudiant en informatique finit par rencontrer au cours de sa formation. Comprendre le fonctionnement des bases numériques permet non seulement de mieux saisir le fonctionnement interne des ordinateurs, mais également d'optimiser certaines opérations de calcul, d'entreposage et de transmission des données.
Les systèmes de numération sont extrêmement variés. Bien que la base décimale soit utilisée quotidiennement par les êtres humains, elle n'est qu'un exemple parmi une multitude d'autres possibilités. En informatique, les bases les plus populaires sont la base binaire (2), utilisée directement par les circuits électroniques, la base octale (8), la base hexadécimale (16), particulièrement appréciée des programmeurs systèmes, ainsi que des bases plus spécialisées comme la base ternaire (3) ou la base 62 utilisée dans certains mécanismes de codage d'identifiants et d'adresses compactes. En théorie, il est possible de construire un système de numération dans pratiquement n'importe quelle base. La seule véritable limite réside dans l'ensemble des symboles disponibles et dans l'imagination du concepteur du système.
Le tableau présenté ci-dessous illustre les correspondances entre plusieurs bases populaires afin de mieux visualiser la manière dont une même valeur peut être représentée différemment selon le système choisi. Cette comparaison met en évidence le fait que la représentation d'un nombre dépend entièrement de la base utilisée, même si la valeur mathématique demeure identique. Une fois ce principe assimilé, il devient relativement simple de développer des programmes capables d'effectuer automatiquement des conversions entre différents systèmes de numération.
| Base 2 (Binaire) | Base 3 (Ternaire) | Base 8 (Octale) | Base 10 (Décimal) | Base 16 (Hexadécimal) | Base 62 |
|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 1 | 1 | 1 | 1 | 1 |
| 10 | 2 | 2 | 2 | 2 | 2 |
| 11 | 10 | 3 | 3 | 3 | 3 |
| 100 | 11 | 4 | 4 | 4 | 4 |
| 101 | 12 | 5 | 5 | 5 | 5 |
| 110 | 20 | 6 | 6 | 6 | 6 |
| 111 | 21 | 7 | 7 | 7 | 7 |
| 1000 | 22 | 10 | 8 | 8 | 8 |
| 1001 | 100 | 11 | 9 | 9 | 9 |
| 1010 | 101 | 12 | 10 | A | A |
| 1011 | 102 | 13 | 11 | B | B |
| 1100 | 110 | 14 | 12 | C | C |
| 1101 | 111 | 15 | 13 | D | D |
| 1110 | 112 | 16 | 14 | E | E |
| 1111 | 120 | 17 | 15 | F | F |
| 10000 | 121 | 20 | 16 | 10 | G |
| 10001 | 122 | 21 | 17 | 11 | H |
| 10010 | 200 | 22 | 18 | 12 | I |
| 10011 | 201 | 23 | 19 | 13 | J |
| 10100 | 202 | 24 | 20 | 14 | K |
| 10101 | 210 | 25 | 21 | 15 | L |
| 10110 | 211 | 26 | 22 | 16 | M |
| 10111 | 212 | 27 | 23 | 17 | N |
| 11000 | 220 | 30 | 24 | 18 | O |
| 11001 | 221 | 31 | 25 | 19 | P |
| 11010 | 222 | 32 | 26 | 1A | Q |
| 11011 | 1000 | 33 | 27 | 1B | R |
| 11100 | 1001 | 34 | 28 | 1C | S |
| 11101 | 1002 | 35 | 29 | 1D | T |
| 11110 | 1010 | 36 | 30 | 1E | U |
| 11111 | 1011 | 37 | 31 | 1F | V |
| 100000 | 1012 | 40 | 32 | 20 | W |
| 100001 | 1020 | 41 | 33 | 21 | X |
| 100010 | 1021 | 42 | 34 | 22 | Y |
| 100011 | 1022 | 43 | 35 | 23 | Z |
| 100100 | 1100 | 44 | 36 | 24 | a |
| 100101 | 1101 | 45 | 37 | 25 | b |
| 100110 | 1102 | 46 | 38 | 26 | c |
| 100111 | 1110 | 47 | 39 | 27 | d |
| 101000 | 1111 | 50 | 40 | 28 | e |
| 101001 | 1112 | 51 | 41 | 29 | f |
| 101010 | 1120 | 52 | 42 | 2A | g |
| 101011 | 1121 | 53 | 43 | 2B | h |
| 101100 | 1122 | 54 | 44 | 2C | i |
| 101101 | 1200 | 55 | 45 | 2D | j |
| 101110 | 1201 | 56 | 46 | 2E | k |
| 101111 | 1202 | 57 | 47 | 2F | l |
| 110000 | 1210 | 60 | 48 | 30 | m |
| 110001 | 1211 | 61 | 49 | 31 | n |
| 110010 | 1212 | 62 | 50 | 32 | o |
| 110011 | 1220 | 63 | 51 | 33 | p |
| 110100 | 1221 | 64 | 52 | 34 | q |
| 110101 | 1222 | 65 | 53 | 35 | r |
| 110110 | 2000 | 66 | 54 | 36 | s |
| 110111 | 2001 | 67 | 55 | 37 | t |
| 111000 | 2002 | 70 | 56 | 38 | u |
| 111001 | 2010 | 71 | 57 | 39 | v |
| 111010 | 2011 | 72 | 58 | 3A | w |
| 111011 | 2012 | 73 | 59 | 3B | x |
| 111100 | 2020 | 74 | 60 | 3C | y |
| 111101 | 2021 | 75 | 61 | 3D | z |
Ternaire
Voici un programme permettant d'effectuer une conversion d'une valeur décimal à ternaire en Delphi :
- Program Ternaire;
-
- {$APPTYPE CONSOLE}
-
- Uses SysUtils;
-
- Function DecimalToTernaire(value:Integer):String;
- Var
- _Result,strNumber:String;
- Begin
- If value = 0 Then DecimalToTernaire := '0'
- Else Begin
- Result := '';
- While value > 0 do Begin
- Str(value mod 3,strNumber);
- _Result := strNumber + _Result;
- value := value div 3;
- End;
- DecimalToTernaire:=_Result;
- End;
- End;
-
- Var
- I:Byte;
-
- BEGIN
- For I := 0 to 20 do Begin
- WriteLn(I,' = ',DecimalToTernaire(I));
- End;
- END.
on obtiendra le résultat suivant :
0 = 01 = 1
2 = 2
3 = 10
4 = 11
5 = 12
6 = 20
7 = 21
8 = 22
9 = 100
10 = 101
11 = 102
12 = 110
13 = 111
14 = 112
15 = 120
16 = 121
17 = 122
18 = 200
19 = 201
20 = 202
Hexadécimal
Voici un programme très performant permettant d'effectuer une conversion d'une valeur d'un octet à hexadécimal en Delphi :
- Program Hexadecimal;
-
- {$APPTYPE CONSOLE}
-
- Uses SysUtils;
-
- Function ByteHex2Str(value:Byte):String;
- Const
- matrix:Array[0..15]of Char = ('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
- Begin
- ByteHex2Str:=matrix[(value shr 4) and $0F]+matrix[value and $F];
- End;
-
- BEGIN
- WriteLn('00h = ',ByteHex2Str($00));
- WriteLn('01h = ',ByteHex2Str($01));
- WriteLn('02h = ',ByteHex2Str($02));
- WriteLn('0Ah = ',ByteHex2Str($0A));
- WriteLn('0Fh = ',ByteHex2Str($0F));
- WriteLn('10h = ',ByteHex2Str($10));
- WriteLn('20h = ',ByteHex2Str($20));
- WriteLn('56h = ',ByteHex2Str($56));
- WriteLn('73h = ',ByteHex2Str($73));
- WriteLn('EFh = ',ByteHex2Str($EF));
- WriteLn('FFh = ',ByteHex2Str($FF));
- END.
on obtiendra le résultat suivant :
00h = 0001h = 01
02h = 02
0Ah = 0A
0Fh = 0F
10h = 10
20h = 20
56h = 56
73h = 73
EFh = EF
FFh = FF
Base62
Voici un programme permettant d'effectuer une conversion d'une valeur décimal à «Base62» en Delphi :
- Program Base62;
-
- {$APPTYPE CONSOLE}
-
- Uses SysUtils;
-
- Function DecimalToBase62(value:Integer):String;
- Const
- TBase:Array[0..61]of Char='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
- Var
- _Result:String;
- Begin
- If value = 0 Then DecimalToBase62 := '0'
- Else Begin
- _Result := '';
- While value > 0 do Begin
- _Result := TBase[value mod 62] + _result;
- value := value div 62;
- End;
- DecimalToBase62:=_Result;
- End;
- End;
-
- Var
- I:Byte;
-
- BEGIN
- For I := 60 to 80 do Begin
- WriteLn(I,' = ',DecimalToBase62(I));
- End;
- END.
on obtiendra le résultat suivant :
60 = y61 = z
62 = 10
63 = 11
64 = 12
65 = 13
66 = 14
67 = 15
68 = 16
69 = 17
70 = 18
71 = 19
72 = 1A
73 = 1B
74 = 1C
75 = 1D
76 = 1E
77 = 1F
78 = 1G
79 = 1H
80 = 1I
BaseX
Avec exemples les précédents, vous l'aurez compris, il est possible d'avoir une formule pour n'importe quel base. En somme, voici un programme permettant d'effectuer une conversion d'une valeur décimal à base relative entre 1 et 61 (mais 13 très pour celui-ci) en Delphi :
- Program BaseX;
-
- {$APPTYPE CONSOLE}
-
- Uses SysUtils;
-
- Function DecimalToBaseX(value:Integer;baseNumber:Byte):String;
- Const
- TBase:Array[0..61]of Char='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
- Var
- _Result:String;
- Begin
- If value = 0 Then DecimalToBaseX := TBase[0]
- Else Begin
- _Result := '';
- While value > 0 do Begin
- _Result := TBase[value mod baseNumber] + _result;
- value := value div baseNumber;
- End;
- DecimalToBaseX:=_Result;
- End;
- End;
-
- Var
- I:Byte;
-
- BEGIN
- For I := 0 to 20 do Begin
- WriteLn(I,' = ',DecimalToBaseX(I,13));
- End;
- END.
on obtiendra le résultat suivant :
0 = 01 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
10 = A
11 = B
12 = C
13 = 10
14 = 11
15 = 12
16 = 13
17 = 14
18 = 15
19 = 16
20 = 17