Système à base 36
La base 36 est une base de numération positionnelle qui utilise 36 comme base. Le choix de 36 est pratique car il peut être représenté en utilisant les chiffres du système de numération indo-arabe (0-9) et les vingt-six lettres de l'alphabet latin (A-Z). La base 36 est donc le système de numération insensible à la casse le plus compact utilisant les caractères ASCII.
Exemples
modifierTable de conversion :
Décimal | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Sénaire | 0 | 1 | 2 | 3 | 4 | 5 | 10 | 11 | 12 | 13 | 14 | 15 | 20 | 21 | 22 | 23 | 24 | 25 |
Base 36 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | G | H |
Décimal | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 |
Sénaire | 30 | 31 | 32 | 33 | 34 | 35 | 40 | 41 | 42 | 43 | 44 | 45 | 50 | 51 | 52 | 53 | 54 | 55 |
Base 36 | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
Quelques nombres dans le système décimal, en sénaire et base 36:
Décimal | Sénaire | Base 36 |
---|---|---|
1 | 1 | 1 |
10 | 14 | A |
100 | 244 | 2S |
1 000 | 4344 | RS |
10 000 | 11 4144 | 7PS |
100 000 | 205 0544 | 255S |
1 000 000 | 3323 3344 | LFLS |
1 000 000 000 | 2431 2124 5344 | GJDGXS |
1 000 000 000 000 | 2043 2210 1030 1344 | CRE66I9S |
Sénaire | Base 36 | Décimal |
---|---|---|
1 | 1 | 1 |
100 | 10 | 36 |
1 0000 | 100 | 1 296 |
100 0000 | 1000 | 46 656 |
1 0000 0000 | 10000 | 1 679 616 |
100 0000 0000 | 100000 | 60 466 176 |
1 0000 0000 0000 | 1000000 | 2 176 782 336 |
100 0000 0000 0000 | 10000000 | 78 364 164 096 |
1 0000 0000 0000 0000 | 100000000 | 2 821 109 907 456 |
52 3032 3041 2221 3014 | WIKIPEDIA | 91 730 738 691 298 |
Fraction | Décimal | Sénaire | Base 36 |
---|---|---|---|
1/2 | 0,5 | 0,3 | 0,I |
1/3 | 0,3 | 0,2 | 0,C |
1/4 | 0,25 | 0,13 | 0,9 |
1/5 | 0,2 | 0,1 | 0,7 |
1/6 (1/10) | 0,16 | 0,1 | 0,6 |
1/7 (1/11) | 0,142857 | 0,05 | 0,5 |
1/8 (1/12) | 0,125 | 0,043 | 0,4I |
1/9 (1/13) | 0,1 | 0,04 | 0,4 |
1/10 (1/14) | 0,1 | 0,03 | 0,3L |
Conversion
modifierEn C
modifierstatic char *base36enc(long unsigned int value)
{
char base36[36] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
/* log(2**64) / log(36) = 12.38 => max 13 char + '\0' */
char buffer[14];
unsigned int offset = sizeof(buffer);
buffer[--offset] = '\0';
do {
buffer[--offset] = base36[value % 36];
} while (value /= 36);
return strdup(&buffer[offset]); // warning: this must be free-d by the user
}
static long unsigned int base36dec(const char *text)
{
return strtoul(text, NULL, 36);
}
En Java
modifierpublic class Base36 {
public static long decode(final String value) {
return Long.parseLong(value, 36);
}
public static String encode(final long value) {
return Long.toString(value, 36);
}
}
En PHP
modifierThe decimal value of 12abcxyz is <?php print base_convert("12abcxyz",36,10); ?>
En Ruby
modifier1412823931503067241.to_s(36) #=> "aqf8aa0006eh"
"aqf8aa0006eh".to_i(36) #=> 1412823931503067241
En JavaScript
modifier(1234567890).toString(36) // => "kf12oi"
parseInt("kf12oi",36) // => 1234567890
En bash
modifierLe code suivant fonctionne dans tout shell conforme à la norme POSIX, mais il nécessite le logiciel bc
et utilisation de la commande echo
avec l'option -n
(qui peut poser des problèmes de compatibilité).
b36(){
b36arr=(0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)
for i in $(echo "obase=36; $1"| bc)
do echo -n ${b36arr[${i#0}]}
done
echo
}