Как обрезать все предыдущие нули 32-битного двоичного числа? - PullRequest
0 голосов
/ 22 января 2020

Я пытался обрезать все начальные / предшествующие нули в двоичном 32-битном числе и распечатать выходные данные по следующим двум кодам, первый из которых показал ошибку, а другой код был успешным:

Я хочу знать, почему первый провалился. пожалуйста, объясните подробно. это будет много значить для меня.

    string trimmer(string& binary_str) {

    int i=0;// 'i' will finally have the index of the binary string which is having value as '0' and is 
            //  just the preceding zero to the first 1 in the string 

    while (binary_str.at(i) != 1) {//this will iterate over the srting until it reaches the zero before 
                                   //the first 1 in the string
        i++;
    }
    binary_str.erase(0, i);      //this will erase all the preceeding zeroes
    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;
}

Оба имеют функцию ie, если задан input : двоичная строка 00000000000000000000001011001011, тогда вывод должен быть 1011001011.

Прежний код, используемый при l oop, тогда как последний используется для l oop с условным условием. Бот-коды следуют тому же логу c. но первый с while l oop обнаружил ошибку, а второй нет.

Кто-нибудь может мне объяснить причину, по которой l oop выдает ошибку? это будет много значить для меня.

Полный код выглядит следующим образом:

#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 ]

3 голосов
/ 22 января 2020

Вы можете использовать find_first_not_of, чтобы найти первый символ, который не является 0. Затем вы можете erase всех персонажей до этого момента. Если строка содержит все нули, она будет полностью удалена.

void trim_leading_zeros(std::string &str) {
    str.erase(0, str.find_first_not_of('0'));
}
0 голосов
/ 22 января 2020

найти первое вхождение '1' и использовать этот вариант строкового конструктора

    string (const string& str, size_t pos, size_t len = npos);

str = строка, которая будет скопирована из

pos = начальная позиция для копирования из

npos = количество символов для копирования из строки источника (str).

0 голосов
/ 22 января 2020

Попробуйте использовать современные функции C ++:

#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;
}

Попробуйте live

...