Ocaml et hexadécimal

Je vois qu'il y a beaucoup de gens qui tombent sur mon blog en cherchant "ocaml hexadecimal". Et ils doivent être décus de ne rien trouver… C'est pourquoi j'ai décidé d'écrire rapidement un petit quelque chose à ce sujet là.

Tout d'abord, il faut savoir qu'en caml, les choses suivantes sont équivalentes :
# 0xf;;
- : int = 15
# 0o17;;
- : int = 15
# 0b1111;;
- : int = 15
# 15;;
- : int = 15

Le premier est écrit en hexadécimal, le second en ocal, le troisième en binaire, et le dernier en décimal. Donc la gestion de l'hexadécimal en OCaml est native.

Une des utilisations courantes de l'hexadécimal est pour représenter les couleurs en 65536 couleurs. Pour convertir un entier en tuple r,g,b on peut utiliser la fonction suivante :

let hex_to_rgb n =  (n / 0×10000, (n/0×100) mod 0×100, n mod 0×100)

Dans l'autre sens, c'est un peu plus compliqué : en effet, en mémoire tous les entiers sont stockés de la même manière (int31 à la caml), et on s'en fiche de savoir sous quelle forme ils sont entrés. Mais ce n'est pas un drame ; effectivement, on a besoin d'avoir un entier sous forme hexadécimale principalement pour l'affichage, donc on utilise les fonctions du module Printf1 :

let print_hexa = printf "0x%x"

Je vous renvoie à la documentation du module Pervasives pour plus de détails.

Espérons que maintenant ceux qui passeront ici en cherchant ocaml hexadécimal repartirons heureux ;)

  1. C'est la seule exception à la règle ne jamais faire un open Module en début de fichier []

2 Responses to "Ocaml et hexadécimal"

Olivier Schwander says:

Même si ce n'est pas tout à fait dans le cadre de ce billet, je ne peux me retenir de parler de la capacité de OCaml de comprendre des nombres avec des _ au milieu.

Comment ça ça ne sert à rien (dany_inside) ? Vous ne trouvez pas que 123_456_789 c'est plus clair que 123456789 ? Vous êtes de mauvaise fois, vraiment…

On peut aussi rappeler que même en caml, les divisions et les multiplications par des puissances de 2 se font avec des décalages de bits.

Pour mémoire :
x lsl y : décaler x à gauche de y bits
lsr : à droite
lor OU binaire
land ET binaire
lxor XOR binaire

C'est pas sûr qu'on y gagne vraiment beaucoup en performances mais quand il s'agit de manipuler des nombres qui sont en fait des champs de bits, héritage de l'assembleur et du c, c'est quand même plus élégant.

Voilà.

Fab says:

Alors là je suis déçu !
J'ai tapé "ocaml hexadécimal" dans mon moteur de recherche favoris, et je tombe sur ce billet où l'on ne parle même pas du sujet qui m'intéresse : "la reproduction des bisounours"…
Pfff, déçu déçu déçu !

PS : iderrick : +1 pour les '_' (ça parse ou ça casse)

Leave a Reply