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.

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
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);
}


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);
  }
}
The decimal value of 12abcxyz is <?php print base_convert("12abcxyz",36,10); ?>


1412823931503067241.to_s(36)  #=> "aqf8aa0006eh"
"aqf8aa0006eh".to_i(36)  #=> 1412823931503067241

En JavaScript

[modifier | modifier le code]
(1234567890).toString(36)  // => "kf12oi"
parseInt("kf12oi",36) // => 1234567890

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
}

Notes et références

[modifier | modifier le code]