Je voudrais savoir quand on a une valeur exemple 101010 combien de 1 il y a içi 3 et je n'arrive pas a le faire pour mon programme si quelqu'un peut m'aider
Je voudrais savoir quand on a une valeur exemple 101010 combien de 1 il y a içi 3 et je n'arrive pas a le faire pour mon programme si quelqu'un peut m'aider
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 AnsiString buffer = "10011001" ; int compteur=0; for(int i=1; i <= buffer.Length(); i++) { if( buffer[i] == '1' ) { compteur = compteur + 1 ; } } ShowMessage( "Il y a " + IntToStr( compteur ) + " fois le chiffre '1' dans " + buffer ) ;
Salut !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2AnsiString Chaine = "10101001";
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 int Ones(AnsiString N) { int n = 0; int max = N.Length() + 1; for(int j = 1; j < max; j++) n = n + (N[j] == '1'); return n; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Label1->Caption = Ones(Chaine);
Autre solution :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 int Valeur = 0xC9;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 int Ones(int N) { int n = 0; for(int j = 0; j < 32; j++) { n = n + (N & 1); N = N / 2; // ou N = N >> 1; } return n; }
A plus !
Salut, laisse moi te taquineren te demandant pourquoi tu ne fais pas:
Au lieu de l'appeler compteur tu pourrais l'appeler c, de cette manière tu ferais
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 compteur++;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 c++;
la réponse est là. Avec 5 opérations au lieu d'une boucle de 32 itérations...
Salut !
Le plus optimisé passe par un Tableau ( Byte Ones[256] ) donc à initialiser...
Pour un Byte, c'est une simple lecture du tableau (il n'y a pas plus rapide)
Pour un short, c'est l'addition de deux lectures du tableau
Pour un int, c'est l'addition de quatre lectures du tableau
Comme ici on est très près de la machine (C, C++), on a intérêt à suggérer au compilateur de travailler au niveau du Byte (struct + union) pour accéder aux bytes du int sans faire glisser quoique ce soit.
Par contre... vérifier si le µ ne sait pas le faire... avec une seule instruction machine !
C'est un peu comme le parity/odd pour lequel on peut s'amuser à tirer un algorithme mais qui existe sous forme de flag dans le registre cpu (résultat du cablage physique d'un parity tree) ! Non ?
Donc si c'est amusant à faire d'un point de vue algorithmique, ça n'en demeure pas moins ridicule face à d'autres solutions (en termes de rapidité d'exécution) !
Et comme ici je ne sais pas à qui j'ai à faire ni dans quel domaine on est, j'ai donné ce qu'il y a de plus simple (même si c'est poussif !!!) !
A plus !
Partager