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

Table de conversion :

Décimal 01234567891011121314151617
Sénaire 012345101112131415202122232425
Base 36 0123456789ABCDEFGH
 
Décimal 181920212223242526272829303132333435
Sénaire 303132333435404142434445505152535455
Base 36 IJKLMNOPQRSTUVWXYZ

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

En C

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

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

The decimal value of 12abcxyz is <?php print base_convert("12abcxyz",36,10); ?>


En Ruby

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

En JavaScript

(1234567890).toString(36)  // => "kf12oi"
parseInt("kf12oi",36) // => 1234567890

En bash

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

    • Portail de l’informatique
    • Portail des mathématiques
    Cet article est issu de Wikipedia. Le texte est sous licence Creative Commons - Attribution - Partage dans les Mêmes. Des conditions supplémentaires peuvent s'appliquer aux fichiers multimédias.