IP calc на с++ как реализовать вывод двоичной формы

В программе выводится ip адрес, маска, первый и последний хост, широковещательный адрес в десятичной форме, как мне реализовать вывод в двоичной форме этих элементов?

#include <iostream>

using namespace std;

int main()
{
    system("chcp 1251");

    int IP[4];
    int MasSet[4];
    bool Success = false;
    

    int MasSetNumber = 0;

    int IP2_1[8];
    int IP2_2[8];
    int IP2_3[8];
    int IP2_4[8];

    int MasSet2_1[8];
    int MasSet2_2[8];
    int MasSet2_3[8];
    int MasSet2_4[8];

    int Res1[8];
    int Res2[8];
    int Res3[8];
    int Res4[8];

    int ResOne[4] = { 0, 0, 0, 0 };

    int ResShir[8] = { 1, 1, 1, 1, 1, 1, 1, 1 };

    int Shir = 0;
    //двоичная система

    //Ввод IP-адреса и маски
    while (Success == false)
    {
        cout << "Введите IP-адрес (вместо точкек используйте пробел!): ";
        cin >> IP[0] >> IP[1] >> IP[2] >> IP[3];
        cout << "1: 128.0.0.0" << endl << "2: 192.0.0.0" << endl << "3: 224.0.0.0" << endl << "4: 240.0.0.0" << endl << "5: 248.0.0.0" << endl << "6: 252.0.0.0" << endl << "7: 254.0.0.0" << endl << "8: 255.0.0.0" << endl << "9: 255.128.0.0" << endl << "10: 255.192.0.0" << endl << "11: 255.224.0.0" << endl << "12: 255.240.0.0" << endl << "13: 255.248.0.0" << endl << "14: 255.252.0.0" << endl << "15: 255.254.0.0" << endl << "16: 255.255.0.0" << endl << "17: 255.255.128.0" << endl << "18: 255.255.192.0" << endl << "19: 255.255.224.0" << endl << "20: 255.255.240.0" << endl << "20: 255.255.240.0" << endl << "21: 255.255.248.0" << endl << "22: 255.255.252.0" << endl << "23: 255.255.254.0" << endl << "24: 255.255.255.0" << endl << "25: 255.255.255.128" << endl << "26: 255.255.255.192" << endl << "27: 255.255.255.224" << endl << "28: 255.255.255.240" << endl << "29: 255.255.255.248" << endl << "30: 255.255.255.252" << endl << "31: 255.255.255.254" << endl << "32: 255.255.255.255" << endl << "Введите номер маски сети: ";
        cin >> MasSetNumber;

        if ((IP[0] >= 0 && IP[0] <= 255) && (IP[1] >= 0 && IP[1] <= 255) && (IP[2] >= 0 && IP[2] <= 255) && (IP[3] >= 0 && IP[3] <= 255) && (MasSetNumber > 0 && MasSetNumber < 33)) Success = true;
    }

    if (MasSetNumber == 1)
    {
        MasSet[0] = 128;
        MasSet[1] = 0;
        MasSet[2] = 0;
        MasSet[3] = 0;
    }

    else if (MasSetNumber == 2)
    {
        MasSet[0] = 192;
        MasSet[1] = 0;
        MasSet[2] = 0;
        MasSet[3] = 0;
    }

    else if (MasSetNumber == 3)
    {
        MasSet[0] = 224;
        MasSet[1] = 0;
        MasSet[2] = 0;
        MasSet[3] = 0;
    }

    else if (MasSetNumber == 4)
    {
        MasSet[0] = 240;
        MasSet[1] = 0;
        MasSet[2] = 0;
        MasSet[3] = 0;
    }

    else if (MasSetNumber == 5)
    {
        MasSet[0] = 248;
        MasSet[1] = 0;
        MasSet[2] = 0;
        MasSet[3] = 0;
    }

    else if (MasSetNumber == 6)
    {
        MasSet[0] = 252;
        MasSet[1] = 0;
        MasSet[2] = 0;
        MasSet[3] = 0;
    }

    else if (MasSetNumber == 7)
    {
        MasSet[0] = 254;
        MasSet[1] = 0;
        MasSet[2] = 0;
        MasSet[3] = 0;
    }

    else if (MasSetNumber == 8)
    {
        MasSet[0] = 255;
        MasSet[1] = 0;
        MasSet[2] = 0;
        MasSet[3] = 0;
    }

    else if (MasSetNumber == 9)
    {
        MasSet[0] = 255;
        MasSet[1] = 128;
        MasSet[2] = 0;
        MasSet[3] = 0;
    }

    else if (MasSetNumber == 10)
    {
        MasSet[0] = 255;
        MasSet[1] = 192;
        MasSet[2] = 0;
        MasSet[3] = 0;
    }

    else if (MasSetNumber == 11)
    {
        MasSet[0] = 255;
        MasSet[1] = 224;
        MasSet[2] = 0;
        MasSet[3] = 0;
    }

    else if (MasSetNumber == 12)
    {
        MasSet[0] = 255;
        MasSet[1] = 240;
        MasSet[2] = 0;
        MasSet[3] = 0;
    }

    else if (MasSetNumber == 13)
    {
        MasSet[0] = 255;
        MasSet[1] = 248;
        MasSet[2] = 0;
        MasSet[3] = 0;
    }

    else if (MasSetNumber == 14)
    {
        MasSet[0] = 255;
        MasSet[1] = 252;
        MasSet[2] = 0;
        MasSet[3] = 0;
    }

    else if (MasSetNumber == 15)
    {
        MasSet[0] = 255;
        MasSet[1] = 254;
        MasSet[2] = 0;
        MasSet[3] = 0;
    }

    else if (MasSetNumber == 16)
    {
        MasSet[0] = 255;
        MasSet[1] = 255;
        MasSet[2] = 0;
        MasSet[3] = 0;
    }

    else if (MasSetNumber == 17)
    {
        MasSet[0] = 255;
        MasSet[1] = 255;
        MasSet[2] = 128;
        MasSet[3] = 0;
    }

    else if (MasSetNumber == 18)
    {
        MasSet[0] = 255;
        MasSet[1] = 255;
        MasSet[2] = 192;
        MasSet[3] = 0;
    }

    else if (MasSetNumber == 19)
    {
        MasSet[0] = 255;
        MasSet[1] = 255;
        MasSet[2] = 224;
        MasSet[3] = 0;
    }

    else if (MasSetNumber == 20)
    {
        MasSet[0] = 255;
        MasSet[1] = 255;
        MasSet[2] = 240;
        MasSet[3] = 0;
    }

    else if (MasSetNumber == 21)
    {
        MasSet[0] = 255;
        MasSet[1] = 255;
        MasSet[2] = 248;
        MasSet[3] = 0;
    }

    else if (MasSetNumber == 22)
    {
        MasSet[0] = 255;
        MasSet[1] = 255;
        MasSet[2] = 252;
        MasSet[3] = 0;
    }

    else if (MasSetNumber == 23)
    {
        MasSet[0] = 255;
        MasSet[1] = 255;
        MasSet[2] = 254;
        MasSet[3] = 0;
    }

    else if (MasSetNumber == 24)
    {
        MasSet[0] = 255;
        MasSet[1] = 255;
        MasSet[2] = 255;
        MasSet[3] = 0;
    }

    else if (MasSetNumber == 25)
    {
        MasSet[0] = 255;
        MasSet[1] = 255;
        MasSet[2] = 255;
        MasSet[3] = 128;
    }

    else if (MasSetNumber == 26)
    {
        MasSet[0] = 255;
        MasSet[1] = 255;
        MasSet[2] = 255;
        MasSet[3] = 192;
    }

    else if (MasSetNumber == 27)
    {
        MasSet[0] = 255;
        MasSet[1] = 255;
        MasSet[2] = 255;
        MasSet[3] = 224;
    }

    else if (MasSetNumber == 28)
    {
        MasSet[0] = 255;
        MasSet[1] = 255;
        MasSet[2] = 255;
        MasSet[3] = 240;
    }

    else if (MasSetNumber == 29)
    {
        MasSet[0] = 255;
        MasSet[1] = 255;
        MasSet[2] = 255;
        MasSet[3] = 248;
    }

    else if (MasSetNumber == 30)
    {
        MasSet[0] = 255;
        MasSet[1] = 255;
        MasSet[2] = 255;
        MasSet[3] = 252;
    }

    else if (MasSetNumber == 31)
    {
        MasSet[0] = 255;
        MasSet[1] = 255;
        MasSet[2] = 255;
        MasSet[3] = 254;
    }

    else if (MasSetNumber == 32)
    {
        MasSet[0] = 255;
        MasSet[1] = 255;
        MasSet[2] = 255;
        MasSet[3] = 255;
    }

    //Перевод IP-адреса и маски сети в двоичный код
    for (int i = 0; IP[0] > 0; i++)
    {
        //IP-1
        IP2_1[i] = IP[0] % 2;
        IP[0] /= 2;
        //IP-2
        IP2_2[i] = IP[1] % 2;
        IP[1] /= 2;
        //IP-3
        IP2_3[i] = IP[2] % 2;
        IP[2] /= 2;
        //IP-4
        IP2_4[i] = IP[3] % 2;
        IP[3] /= 2;
        //MasSet-1
        MasSet2_1[i] = MasSet[0] % 2;
        MasSet[0] /= 2;
        //MasSet-2
        MasSet2_2[i] = MasSet[1] % 2;
        MasSet[1] /= 2;
        //MasSet-3
        MasSet2_3[i] = MasSet[2] % 2;
        MasSet[2] /= 2;
        //MasSet-4
        MasSet2_4[i] = MasSet[3] % 2;
        MasSet[3] /= 2;
    }

    //Перемножение IP-адреса и маски сети
    for (int i = 0; i < 8; i++)
    {
        Res1[i] = IP2_1[i] * MasSet2_1[i];
        Res2[i] = IP2_2[i] * MasSet2_2[i];
        Res3[i] = IP2_3[i] * MasSet2_3[i];
        Res4[i] = IP2_4[i] * MasSet2_4[i];
    }

    //Перевод адреса сети из 2-й ф.с. в 10-ю ф.с.
    for (int i = 0, a = 1; i < 8; i++, a *= 2)
    {
        if (Res1[i] != 0) Res1[i] = 1 * a;
        if (Res2[i] != 0) Res2[i] = 1 * a;
        if (Res3[i] != 0) Res3[i] = 1 * a;
        if (Res4[i] != 0) Res4[i] = 1 * a;
    }

    for (int i = 0; i < 8; i++)
    {
        ResOne[0] += Res1[i];
        ResOne[1] += Res2[i];
        ResOne[2] += Res3[i];
        ResOne[3] += Res4[i];
    }

    //Вывод адреса сети
    cout << "Адрес сети: " << ResOne[0] << "." << ResOne[1] << "." << ResOne[2] << "." << ResOne[3] << endl;

    //Вывод широковещательного адреса
    if (MasSetNumber > 0 && MasSetNumber < 25) cout << "Широковещательный адрес: " << ResOne[0] << "." << ResOne[1] << "." << ResOne[2] << "." << "255";

    else if (MasSetNumber == 25)
    {
        ResShir[0] = IP2_4[7];

        for (int i = 7, a = 1; i >= 0; i--, a *= 2)
        {
            if (ResShir[i] != 0) Shir += ResShir[i] * a;
        }

        cout << "Широковещательный адрес: " << ResOne[0] << "." << ResOne[1] << "." << ResOne[2] << "." << Shir;
    }

    else if (MasSetNumber == 26)
    {
        ResShir[0] = IP2_4[7];
        ResShir[1] = IP2_4[6];

        for (int i = 7, a = 1; i >= 0; i--, a *= 2)
        {
            if (ResShir[i] != 0) Shir += ResShir[i] * a;
        }

        cout << "Широковещательный адрес: " << ResOne[0] << "." << ResOne[1] << "." << ResOne[2] << "." << Shir;
    }

    else if (MasSetNumber == 27)
    {
        ResShir[0] = IP2_4[7];
        ResShir[1] = IP2_4[6];
        ResShir[2] = IP2_4[5];

        for (int i = 7, a = 1; i >= 0; i--, a *= 2)
        {
            if (ResShir[i] != 0) Shir += ResShir[i] * a;
        }

        cout << "Широковещательный адрес: " << ResOne[0] << "." << ResOne[1] << "." << ResOne[2] << "." << Shir;
    }

    else if (MasSetNumber == 28)
    {
        ResShir[0] = IP2_4[7];
        ResShir[1] = IP2_4[6];
        ResShir[2] = IP2_4[5];
        ResShir[3] = IP2_4[4];

        for (int i = 7, a = 1; i >= 0; i--, a *= 2)
        {
            if (ResShir[i] != 0) Shir += ResShir[i] * a;
        }

        cout << "Широковещательный адрес: " << ResOne[0] << "." << ResOne[1] << "." << ResOne[2] << "." << Shir;
    }

    else if (MasSetNumber == 29)
    {
        ResShir[0] = IP2_4[7];
        ResShir[1] = IP2_4[6];
        ResShir[2] = IP2_4[5];
        ResShir[3] = IP2_4[4];
        ResShir[4] = IP2_4[3];

        for (int i = 7, a = 1; i >= 0; i--, a *= 2)
        {
            if (ResShir[i] != 0) Shir += ResShir[i] * a;
        }

        cout << "Широковещательный адрес: " << ResOne[0] << "." << ResOne[1] << "." << ResOne[2] << "." << Shir;
    }

    else if (MasSetNumber == 30)
    {
        ResShir[0] = IP2_4[7];
        ResShir[1] = IP2_4[6];
        ResShir[2] = IP2_4[5];
        ResShir[3] = IP2_4[4];
        ResShir[4] = IP2_4[3];
        ResShir[5] = IP2_4[2];

        for (int i = 7, a = 1; i >= 0; i--, a *= 2)
        {
            if (ResShir[i] != 0) Shir += ResShir[i] * a;
        }

        cout << "Широковещательный адрес: " << ResOne[0] << "." << ResOne[1] << "." << ResOne[2] << "." << Shir;
    }

    else if (MasSetNumber == 31)
    {
        ResShir[0] = IP2_4[7];
        ResShir[1] = IP2_4[6];
        ResShir[2] = IP2_4[5];
        ResShir[3] = IP2_4[4];
        ResShir[4] = IP2_4[3];
        ResShir[5] = IP2_4[2];
        ResShir[6] = IP2_4[1];

        for (int i = 7, a = 1; i >= 0; i--, a *= 2)
        {
            if (ResShir[i] != 0) Shir += ResShir[i] * a;
        }

        cout << "Широковещательный адрес: " << ResOne[0] << "." << ResOne[1] << "." << ResOne[2] << "." << Shir;
    }

    if (MasSetNumber == 32) cout << "Широковещательный адрес: " << ResOne[0] << "." << ResOne[1] << "." << ResOne[2] << "." << ResOne[3];

    //Минимальный IP
    cout << endl << "Минимальный IP: " << ResOne[0] << "." << ResOne[1] << "." << ResOne[2] << "." << ResOne[3] + 1 << endl;

    //Максимальный IP
    if (MasSetNumber > 0 && MasSetNumber < 25) cout << "Максимальный IP: " << ResOne[0] << "." << ResOne[1] << "." << ResOne[2] << "." << "254";
    else if (MasSetNumber > 24 && MasSetNumber < 32) cout << "Максимальный IP: " << ResOne[0] << "." << ResOne[1] << "." << ResOne[2] << "." << Shir - 1;
    else if (MasSetNumber == 32) cout << "Максимальный IP: " << ResOne[0] << "." << ResOne[1] << "." << ResOne[2] << "." << ResOne[3] - 1;
}

Ответы (1 шт):

Автор решения: Harry

Проще всего - использовать bitset. Кратенький пример:

unsigned char ip[4] = { 192, 168, 0, 0 };
for(int i = 0; i < 4; ++i)
    cout << bitset<8>(ip[i]) << " ";
cout << endl;

И еще совет - изучить битовые операции, а то такие "макароны" производят слишком тягостное впечатление...

→ Ссылка