Aussitôt l'arriver du binaire dans le monde des ordinateurs, les «Bases numérique» font partie des algorithmes mathématiques de base pour le dénombrement et la quantification d'information.
Les bases sont très variés, les plus populaires sont Binaire (2), Ternaire (3), Quintale (5), Octale (8), Décimale (10), Hexadécimale (16),.. La seule limite est l'imagination du programmeur...
Voici tout d'abord une table des bases les plus populaires :
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 Perl :
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 Perl :
- #!/usr/bin/perl
-
- sub ByteHex2Str() {
- my ($value) = @_;
- my @matrix = ('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
- return $matrix[($value >> 4) & 0x0F].$matrix[$value & 0x0F];
- }
-
- print "00h = " . &ByteHex2Str(0x00). "\n";
- print "01h = " . &ByteHex2Str(0x01). "\n";
- print "02h = " . &ByteHex2Str(0x02). "\n";
- print "0Ah = " . &ByteHex2Str(0x0A). "\n";
- print "0Fh = " . &ByteHex2Str(0x0F). "\n";
- print "10h = " . &ByteHex2Str(0x10). "\n";
- print "20h = " . &ByteHex2Str(0x20). "\n";
- print "56h = " . &ByteHex2Str(0x56). "\n";
- print "73h = " . &ByteHex2Str(0x73). "\n";
- print "EFh = " . &ByteHex2Str(0xEF). "\n";
- print "FFh = " . &ByteHex2Str(0xFF). "\n";
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 Perl :
- #!/usr/bin/perl
-
- use strict;
-
- sub DecimalToBase62($) {
- my ($value) = @_;
- my @TBase = ('0'..'9','A'..'Z','a'..'z');
- if(0 > $value) {
- return undef;
- }
- if(0 == $value) {
- return $TBase[0];
- }
- my $result = "";
- my $base = $value;
- while($base > 0) {
- $result = $TBase[$base % 62] . $result;
- $base = int($base / 62);
- }
- return $result;
- }
-
- for(my $I = 60; $I <= 80; $I++) {
- print $I." = ".DecimalToBase62($I)."\n";
- }
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 Perl :
- #!/usr/bin/perl
-
- use strict;
-
- sub DecimalToBaseX($$) {
- my ($value,$baseNumber) = @_;
- my @TBase = ('0'..'9','A'..'Z','a'..'z');
- if(0 > $value) {
- return undef;
- }
- if(0 == $value) {
- return $TBase[0];
- }
- my $result = "";
- my $base = $value;
- while($base > 0) {
- $result = $TBase[$base % $baseNumber] . $result;
- $base = int($base / $baseNumber);
- }
- return $result;
- }
-
- for(my $I = 0; $I <= 20; $I++) {
- print $I." = ".DecimalToBaseX($I, 13)."\n";
- }
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