Binaire veut juste dire "base 2". Tout comme décimale veut dire "base 10". Une base de nombres, c'est une liste de chiffres utilisés pour rédiger ce nombre. On passe d'un chiffre à l'autre en incrémentant d'une unité. Et quand on arrive au bout, on incrémente le chiffre à sa gauche et on reprends de zéro.
Donc à l'école maternelle/primaire ce que tu apprenais, c'était à compter en décimal. base 10, donc 10 chiffres différents : de 0 à 9. En binaire tu n'as que 2 chiffres, le 0 et le 1, mais la règle générale est la même.
En pratique pour incrémenter il y a un algorithme direct¹ et simple : en partant de la droite, transformer tous les 1 en 0, et s'arrêter au premier 0 en le transformant en 1.
¹: c'est un cas particulier de l'algorithme d'ajout usuel que vous avez tous les deux cité, mais cette présentation est plus simple à implémenter.
Voici mes étapes :
Les nombres sont saisie en chaîne de caractères avec un point entre les nombres.
Premier Menu :
- choix 1 (correspond à saisir une adresse ip et un masque de sous-réseau) ou 2 (correspond à saisir une adresse ip et un cidr) le cidr est un nombre en int.
Deuxième Menu :
ensuite pour créer son adressage l'utilisateur saisir le nombre de sous-réseaux en choix 1 ou le nombre de machines en choix 2.
J'utilise le type standard pour stocker mes valeurs.
Sinon si tu veux une méthode générique pour incrémenter une variable, tu considère chaque bit comme variable binaire, et tu utilises les tableaux de Karnaugh (Wikipedia) pour établir la fonction pour chaque bit de sortie en fonction des bits d'entrée.
Mais dans la pratique, la méthode proposée par bluestorm est optimale puisque tu n'auras presque jamais besoin de parcourir tout le nombre pour trouver son successeur.
A vue de nez je dirais qu'il est sensé afficher les nombres entiers de 1 à 256 en utilisant des incrémentations successives.
2 remarques :
- avant meme de regarder ce que tu fais dans le corps de la seconde boucle, tu dois inverser l'ordre de tes boucles : là tu "incrémentes" 256 fois pour chacun des chiffres de ton nombre binaire, c'est totalement incohérent.
- tu n'utilises pas l'algorithme proposé par bluestorm, qui est pourtant bien moins compliqué (une condition au lieu de 3)
Si on suit l'algorithme de bluestorm on aurait plutôt :
En fait tu essaye de balayer les adresses IP possibles, mais les gère sous forme textuelle. C'est fort dommage.
tu devrais passer en valeur réelle d'adresse IP : le nombre binaire correspondant. De là tu pourras faire beaucoup plus de manœuvres sans te casser la tête avec des tests dans tous les sens.
J'ai effectué des modifications sur mon code en utilisant un tableau multidimensionnel, se sera déjà un peu plus simple.
voir le code ci-dessous :
using namespace std;
#include <iostream>
int main()
{
string tab[4][4];
int k,m,i,j;
for(k=0;k<2;k++)
{
for(m=0;m<4;m++)
{
if(tab[k][m]=="")
{
tab[k][m]="0";//initialisation du taleau à 0
}
cout<<"le ligne"<<k<<endl;
cout<<"colonne"<<m<<endl;
cout<<tab[k][m]<<endl;;
}
}
for(j=3;j>-1;j--)
{
cout<<"colonne incremente :"<<j<<endl;
for(i=0;i<4;i++)
{
cout<<"ligne incremente :"<<i<<endl;
if(tab[i][j]=="0"&&tab[i][j-1]=="0")//si on trouve un 0 au premier et au deuxième indice.
{
tab[i][j]="1";//alors on met un 1
cout<<tab[i][j]<<endl;
tab[i+1][j]=tab[i][j];//On copie la valeur dans la ligne suivante
i++;//on passe à la ligne suivante
}
if(tab[i][j]=="1"&&tab[i][j-1]=="0")//si on trouve un 1 au premier et un 0 au deuxième indice.
{
tab[i][j]="0";//on mets un 0 au premier indice
tab[i][j-1]="1";//ensuite on mets un 1 à l'indice suivante.
cout<<tab[i][j]<<endl;
cout<<tab[i][j-1]<<endl;
tab[i+1][j]=tab[i][j];//On copie les valeurs dans la ligne suivante
tab[i+1][j-1]=tab[i][j-1];
i++;
}
if(tab[i][j]=="1"&&tab[i][j-1]=="1")//si on trouve un 1 au premier et un 1 au deuxième indice.
{
tab[i][j]="0";//on mets un 0 au premier indice
tab[i][j-1]="0";//on mets un 0 au deuxième indice
tab[i][j-2]="1";//ensuite on mets un 1 à l'indice suivante.
cout<<tab[i][j]<<endl;
cout<<tab[i][j-1]<<endl;
cout<<tab[i][j-2]<<endl;
tab[i+1][j]=tab[i][j];
tab[i+1][j-1]=tab[i][j-1];
tab[i+1][j-2]=tab[i][j-2];
i++;
}
}
cout<<tab[i][j]<<endl;
}
system("pause");
}
Excuse-moi, mais je n'ai pas l'impression que tu lises les réponses.
On essaie de t'aider, mais il faut que tu acceptes les remarque que l'on te fait, et que tu changes ton code en conséquence.
Tu as deux solutions :
l'algorithme proposé par rushia :
Citation : rushia
A vue de nez je dirais qu'il est sensé afficher les nombres entiers de 1 à 256 en utilisant des incrémentations successives.
2 remarques :
- avant meme de regarder ce que tu fais dans le corps de la seconde boucle, tu dois inverser l'ordre de tes boucles : là tu "incrémentes" 256 fois pour chacun des chiffres de ton nombre binaire, c'est totalement incohérent.
- tu n'utilises pas l'algorithme proposé par bluestorm, qui est pourtant bien moins compliqué (une condition au lieu de 3)
Si on suit l'algorithme de bluestorm on aurait plutôt :
Ou utiliser un entier que tu incrémentes, et que tu concatènes par la suite aux 6 premiers octets de l'adresse.
En fait quand je vois ton dernier post, je ne vois aucune des deux méthodes, donc ce serait sympa de nous dire en quoi tu les trouve inutiles afin que l'on puisse mieux t'aider.
Incrémenter en binaire.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
{LVM}Plan de "partitions" pour machines virtuelles ? Carte de capture sous linux ? Erreur ACPI au boot ?
{LVM}Plan de "partitions" pour machines virtuelles ? Carte de capture sous linux ? Erreur ACPI au boot ?