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;
И еще совет - изучить битовые операции, а то такие "макароны" производят слишком тягостное впечатление...