begin process at 2008 07 06 04:51:40
1 205 464 membres
43 nouveaux aujourd'hui
14 119 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CONVERSION AVEC OPÉRATEUR BINAIRE


Information sur la source

Catégorie :Divers Classé sous : opérateurbinaire, binaire, conversion Niveau : Initié Date de création : 27/07/2006 Vu / téléchargé: 5 892 / 93

Note :
6,5 / 10 - par 2 personnes
6,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (4)
Ajouter un commentaire et/ou une note

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

  • 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;
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.
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

  • signaler à un administrateur
    Commentaire de DomJ le 27/07/2006 23:25:23

    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

  • signaler à un administrateur
    Commentaire de Arto_8000 le 28/07/2006 02:21:10

    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.

  • signaler à un administrateur
    Commentaire de FraGag le 28/07/2006 20:47:32

    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.

  • signaler à un administrateur
    Commentaire de Arto_8000 le 28/07/2006 20:52:11

    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.

Ajouter un commentaire

Pub



Appels d'offres

Plugin Dialer outlook
Budget : 2 000€
Travail graphique- ill...
Budget : 1 000€
creation de marque et ...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS