Conversion avec opérateur binaire

Soyez le premier à donner votre avis sur cette source.

Vue 11 653 fois - Téléchargée 165 fois

Description

Il existe des milliers de source pour convertir un nombre en une autre base, mais beaucoup ce limite à faire ces conversion avec les opérateurs Division et Modulo. Je propose une méthode très différentte de celle-ci en introduisant les opérateurs binaires, ainsi que la propriété prototype afin de rajouter ces propres méthodes à des objets comme String et Array.

Source / Exemple :


function dec2bas(nombre,base)
{
	if (!getDecalageFromBase(base))
	{
		alert("Base Invalide");
		return false;
	}
	
	equivalent = new Array("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");
	decalage = getDecalageFromBase(base);
	result = "";
	while(nombre != 0)
	{
		result = equivalent[nombre&(base-1)]+result;
		nombre >>= decalage;
	}
	return result;
}

function bas2dec(nombre,base)
{
	nombre = nombre.reverse();
	equivalent = new Array("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");
	result = 0;
	for (i=0;i<nombre.length;i++)
	{
		result += equivalent.array_search(nombre.charAt(i))*Math.pow(base,i);
	}
	return result;
}

function getDecalageFromBase(base)
{
	i = 1;
	while (Math.pow(base,(1/i)) != 2)
	{
		if (i>base)
		{
			return false;
		}
		i++;
	}
	return i;
}

function array_search(text)
{
	for (a=0;a<this.length;a++)
	{
		if(this[a] == text)
		{
			return a;
		}
	}
}

function reverse()
{
	result = "";
	for (i=this.length-1;i>=0;i--)
	{
		result += this.charAt(i);
	}
	return result;
}

Array.prototype.array_search = array_search;
String.prototype.reverse = reverse;

Conclusion :


Rapidement je vous explique comment la conversion se fait. Supposons que je veux convertir le nombre 20 en hexadécimal.

20 en binaire est 10100 et pour diviser un nombre binaire en hexadécimal il faut le séparer par tranche de 4 bits. Pour le diviser en groupe de 4 bits le script utilise 2 opérateurs binaires & et >>. Le & sert a faire un masque afin de retirer seulement 4 bits à la fois et le >> sert a décaler les bits afin qe se soit quatres nouveaux bits qui soit analyser la prochaine fois. Ainsi mon nombre 20 sera diviser en 1 (0001) et 4 (0100) qui donne 14 en hexadécimal.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Arto_8000
Messages postés
1044
Date d'inscription
lundi 7 mars 2005
Statut
Membre
Dernière intervention
13 juillet 2010
5 -
FraGag -> C'est quand même intéressant ce que tu propose, mais j'ai utilisé les opérateurs binaires pour les faire découvrir, car ils ne sont que très rarement utilisé même si des fois c'est très pratique.
cs_FraGag
Messages postés
82
Date d'inscription
jeudi 19 février 2004
Statut
Membre
Dernière intervention
18 avril 2008
-
Personnellement, je préfère :

var x = 20;
alert(x.toString(16));

qui affiche bien 14... L'argument envoyé à Number.toString() représente la base, entre 2 et 36.

alert(x.toString(2)); 'affiche 10100

L'opération inverse s'effectue avec parseInt(str, base), où str est une chaîne contenant un nombre de la base spécifiée. En passant, spécifiez _toujours_ l'argument base, sinon vous allez avoir des surprises :

alert(parseInt("10")); 'affiche 10
alert(parseInt("010")); 'affiche 8 (comme si base === 8)
alert(parseInt("0x10")); 'affiche 16, fonctionne également si base === 16)

Il existe aussi parseFloat() pour obtenir un nombre à virgule flottante à partir d'une chaîne, mais là il n'y a pas le paramètre base.
Arto_8000
Messages postés
1044
Date d'inscription
lundi 7 mars 2005
Statut
Membre
Dernière intervention
13 juillet 2010
5 -
J'ai mis 1 comme 0001 pour montrer que je prend 4 bits a la fois et non un seul quand il y a conversion d'un nombre décimal à un nombre hexadécimal et même chose pour le 4. En pensant un bit c'est un nombre binaire qui représente la plus petite unité de stockage.
cs_DomJ
Messages postés
140
Date d'inscription
dimanche 4 décembre 2005
Statut
Membre
Dernière intervention
3 décembre 2013
1 -
je trouve ta source belle mais dans l'explication final
Je comprend pas pas pourquoi tu met 1 comme ça "0001" et 4 comme ca "0100" pourquoi met-tu des 0?

Dom

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.