Удалить ведущие нули из двоичного числа, преобразованного из десятичного - PullRequest
4 голосов
/ 13 апреля 2020

Я решаю проблему, в которой мне нужно преобразовать первые N натуральных чисел в двоичные числа. Я использую bitset и .to_string(). Но после того, как число преобразовано в двоичное, оно имеет несколько ведущих нулей, очевидно равных размеру данного набора битов. Задача состоит в том, чтобы удалить это. Я сделал это, используя std::string:: erase() Но я думаю, что это не очень хороший подход. Как я могу оптимизировать эту часть кода?

#include <iostream>
#include <bitset>
#include <string>
int main()
{
    int T;
    std:: cin >> T;
    while(T--) {
    int n;
    std:: cin >> n;
    for(auto i = 1; i <= n; ++i) {
        std::string binary = std::bitset<32>(i).to_string(); //to binary

        //This part here

        int j = 0;
        while(binary[j] == '0') {
            ++j;
        }
        binary.erase(0, j);

        //Till here

        std::cout<<binary<<" ";
    }
    std:: cout << std:: endl;
    }
    return 0;
}

Ответы [ 2 ]

1 голос
/ 13 апреля 2020

Вы можете использовать функцию std::string::find_first_not_of(), чтобы получить позицию первого символа, который не равен нулю. Затем используйте std::string::erase(), чтобы стереть от начала строки (индекс 0) до позиции первого ненулевого символа. Это позволит избежать использования l oop, который вы используете в данный момент.

Пример:

std::string binary = std::bitset<32>(128).to_string(); //"00000000000000000000000010000000"
binary.erase(0, binary.find_first_not_of('0')); //"10000000"
std::cout << binary;
1 голос
/ 13 апреля 2020

Я бы предложил использовать функцию log2 из заголовочного файла cmath. Вы можете посчитать количество битов, которое вам потребуется для представления целого числа в двоичном формате. Таким образом, вам не понадобится время l oop, используемое для подсчета количества ведущих нулей.

Вот код:

#include <iostream>
#include <bitset>
#include <string>
#include <cmath>
int main()
{
    int T;
    std:: cin >> T;
    while(T--) {
    int n;
    std:: cin >> n;
    for(auto i = 1; i <= n; ++i) {
        std::string binary = std::bitset<32>(i).to_string(); //to binary
        int len = log2(i)+1;
        binary.erase(0,32-len);
        std::cout<<binary<<"\n";
    }
    std:: cout << std:: endl;
    }
    return 0;
}

Как указано john в разделе комментариев не обязательно удалять количество ведущих нулей. Для этого вы можете сделать это,

std::cout<<binary.substr(32-len,len)<<"\n";
...