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
[modifier | modifier le code]Table 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
[modifier | modifier le code]En C
[modifier | modifier le code]static 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
[modifier | modifier le code]public 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
[modifier | modifier le code]The decimal value of 12abcxyz is <?php print base_convert("12abcxyz",36,10); ?>
En Ruby
[modifier | modifier le code]1412823931503067241.to_s(36) #=> "aqf8aa0006eh"
"aqf8aa0006eh".to_i(36) #=> 1412823931503067241
En JavaScript
[modifier | modifier le code](1234567890).toString(36) // => "kf12oi"
parseInt("kf12oi",36) // => 1234567890
En bash
[modifier | modifier le code]Le 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
}