Kiberchief
@Kiberchief
Пока учусь.

Как перевести число в двоичную систему счисления?

Написал программу конвертации из десятичной в двоичную систему счисления, но не могу разобраться, почему она некорректно конвертирует некоторые числа. Пробовал даже через itoa, все равно тот же самый некорректный вывод.

ввод 192.168.1.127
вывод 11000000 10101000 1 1111111
а должно быть 11000000 10101000 00000001 01111111

// delete '.'
    int Notspace[4];
    for (int i = 0; i < 4; i++) {
        Notspace[i] = stoi(strAddr.substr(0, '.'));
        std::string tostr = std::to_string(Notspace[i]);
        strAddr.erase(0, tostr.length() + 1);
    }

    // num to binnum
    for (int i = 0; i < 4; i++) {
        while (Notspace[i] > 0) {
            strAddr += char('0' + Notspace[i] % 2);
            Notspace[i] = Notspace[i] / 2;
        }
        strAddr += " ";
    }

    // reverse and cout Binip 
    for (size_t i = 0; i < strAddr.size(); i++) {
        std::string Binip = strAddr.substr(0, strAddr.find(' '));
        std::reverse(Binip.begin(), Binip.end());
        std::cout << Binip << " ";
        strAddr.erase(0, Binip.length() + 1);
    }
  • Вопрос задан
  • 455 просмотров
Пригласить эксперта
Ответы на вопрос 2
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Нужно или выводить нужное количество ведущих нулей, или изменить условие в цикле перевода. У вас там сейчас while (Notspace[i] > 0), что как раз считает цифры до последней значащей цифры. Поменяйте на цикл в 8 итераций и будет у вас всегда 8 цифр.
Ответ написан
Комментировать
@12rbah
А какая цель? Сделать самому конвертер из ip4 в бинарный вид со своими функциями? Или просто написать работающую программу?
Если 2 то можете за основу вщять этот код
#include <iostream>
#include <bitset>
#include <string>
int main()
{
   std::string delimiter = ".";
   size_t pos = 0;
   std::string s = "192.168.0.0"; 
    while ((pos = s.find(delimiter)) != std::string::npos) {
    auto token = s.substr(0, pos);
    std::string binary = std::bitset<8>(stoi(token)).to_string(); //to binary
    std::cout<<binary<<" ";
    s.erase(0, pos + delimiter.length());
    }
    std::cout << std::bitset<8>(stoi(s)).to_string() << std::endl;

}

Если 1, то разбейте задачу на части.
1 - написать функцию split, которая вернет массив из 4 элемнтов(или в зависимости от того сколько раз смогла разделить строку).
2 - написать конвертер из 10 системы в 2.
3 - написать функцию которая заполнит нулями вашу строку, если в ней меньше 8 символов

в целом все эти функции будут полезны и по отдельности, поэтому не надо всё делать в одной функции, вам же потом будет проще дебажить.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы