0
votes

Comment couper tous les zéros précédents d'un nombre binaire 32 bits?

J'essayais de couper tous les zéros leaders / précédents dans un nombre binaire 32 bits et imprimer la sortie par ces 2 codes suivants, dont la première a montré une erreur pendant que l'autre code a été réussi:

Je veux savoir pourquoi l'ancien a échoué. S'il vous plaît expliquer en détail. Cela signifierait beaucoup pour moi. strong> p> xxx pré>

Ce code écrit ci-dessus n'a pas fonctionné et a montré une erreur, P>

mais ce deuxième code a fonctionné : P>

#include<bits/stdc++.h>
using namespace std;
/*
string trimmer(string& binary_str) {
    int i=0;
    while (binary_str.at(i) != 1) {
        i++;
    }
    binary_str.erase(0, i);
    return binary_str;
}
*/
string trimmer(string& binary_str) {
    int i=0;
    for (i = 0; i < 32; i++) {
        if (binary_str.at(i) == '1') {
            break;
        }
    }
    binary_str.erase(0, i);
    return binary_str;
}

int main(){
    string bStr="00000000001011001011"; 
    bStr = trimmer(bStr);
    cout<< bStr<<'\n';
    return 0;
}


3 commentaires

Pourquoi pensez-vous pendant (binary_str.at (i)! = 1) et si (binaire_str.at (i) == '1') { sont les mêmes?


Vous avez utilisé le caractère '1' dans une comparaison (qui se trouve dans ASCII 49) et décimal 1 de l'autre (qui serait le "début de la rubrique" rarement utilisé).


Après la méthode "moderne C ++" de le faire serait d'utiliser std :: Trouver


3 Réponses :


0
votes

Essayez d'utiliser des fonctionnalités C ++ modernes:

#include <iostream>
#include <algorithm>
#include <string>

void ltrim_zero(std::string& str) {
    str.erase(str.begin(), std::find_if(str.begin(), str.end(), [](int character) {
        return '0' != character;
    }));
}

int main(){
    std::string bStr = "00000000001011001011"; 
    ltrim_zero(bStr);
    std::cout << bStr << std::endl;
    return 0;
}


0 commentaires

3
votes

Vous pouvez utiliser Find_First_not_of code> Pour trouver le premier caractère de cela n'est pas un 0 code>. Ensuite, vous pouvez Effacer code> Tous les caractères à ce point. Si une chaîne est tout zéros, elle sera complètement effacée.

void trim_leading_zeros(std::string &str) {
    str.erase(0, str.find_first_not_of('0'));
}


0 commentaires

0
votes

Recherchez la première occurrence de '1' et utilisez cette variante du constructeur de chaînes xxx

str = string à copier de

pos = position de départ à copier de

npos = Nombre de caractère à copier à partir de la chaîne source (STR).


0 commentaires