Определяем адрес сети

  • 24
  • Недоступна
1) Даны IP-адрес и маска подсети, необходимо вычислить адрес сети - реализуй метод getNetAddress. Используйте операцию поразрядной конъюнкции (логическое И). Пример: IP-адрес: 11000000 10101000 00000001 00000010 (192.168.1.2) Маска подсети: 11111111 11111111 11111110 00000000 (255.255.254.0)
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (151)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Dmitry Kharchenko 24 уровень, Москва
11 октября, 08:55
Задача невыполнима для любого человека, который не понимает двоичную систему. Вывел в sout бинарную строку, получил вот такой айпи 11111111111111111111111111000000 11111111111111111111111110101000 1 10. Что тут с чем сравнивать, почему часть такая длинная, часть такая короткая- без понятия. Как сравнивать, если нулей и единиц будет больше/меньше в маске? Дали лекцию по & и решайте как хотите) Чем дальше ухожу по уровням, тем больше задач на тему "Мы вас этому учить не будем, идите в ВУЗ, там вам все разъяснят". И смешно и обидно одновременно. Статьи для начинающих не нашел. Везде написано для тех, кто уже "шарит". Ну окей, с оператором & я разобрался быстро, цикл написал, посимвольно он мне там все сложил. Возможно, даже правильно. Но вывод в консоль: 11111111111111111111111111000000 11111111111111111111111110101000 1 10 11111111111111111111111111111111 11111111111111111111111111111111 11111111111111111111111111111110 0 11111111111111111111111111000000 11111111111111111111111110101000 0 0 Как его преобразовывать? Помогите, объясните, пожалуйста.
Rico 23 уровень, Минск
4 октября, 14:50
Хороша задача, слов нет. Может кому-то поможет такое объяснение. 1) У нас адрес IP и маска записаны в Интах, но приведенные к байтами. Это чтоб нам понятней было (нет). 2) Значит можно сразу сравнивать байты и записывать полученное в массив адреса сети. 3) Адрес сети - есть результат простого сравнения байтов IP и Маски. 4) Простой цикл и сравниваем индекс IP и Маски. 5) Результат записываем в массив адреса сети. Меня сначала испугало то, что Ява мне показывала байты без нулей спереди. Оказалось, что при сравнении она о них помнит и тоже сравнивает :)
Sergey 22 уровень, Ярославль
27 сентября, 17:29
getNetAddress() реализовал следующим образом. 1. Создаем новый byte [] массив из 4-х элементов. 2. Присваиваем каждому элементу новое значение. Каждый элемент получаем путем побитового умножения (&) элементов с соответствующими индексами из массива ip и mask (если кто-то забыл, то 0*1 = 0, 1*0 = 0, 1*1=1, 0*0 = 0). Если вывести каждый элемент обычным sout числа получаются не красивые, но не обращаем внимания, вся магия происходит именно в методе print(). С методом print() пришлось повозиться чуть дольше, т.к. из-за отрицательности полученных чисел при приведении их к byte к выводимому числу добавляются единицы которые нам выводить не нужно, соответственно лишние единицы в начале убираем с помощью substring(). У последних двух элементов напротив нужно добавить недостающие нули, что спокойно можно сделать через цикл определив заранее длину бинарного числа. Бинарное число в виде строки из десятичного можно получить с помощью статического метода toBinaryString() класса Integer. (String binString = Integer.toBinaryString(число);) Преобразование числа можно вынести в отдельный метод, а в print() применять его к выводимым элементам, валидатор принимает такое решение :)
Verhun Kyrylo 23 уровень
15 сентября, 18:07
Уф, задачка потрепала нервы. Недолюбливаю работу с битами но походу ее нужно знать. Много статей перечитал из коментариев. Главное что понял из всего этого. Проблема в том что для метода
getNetAddress();
Передаются массивы с данными в byte и работать мы должны с ними. (делал с интами, все работает, но валидатор не принемает). А так как в последней разряде типа данных byte в java хранится как раз знак числа, и значит мы можем хранить в byte не число 255 а числа от -128 до 127 наше число 192 туда просто не влазит и оно "превращается" в -64 так же со всеми другими числами которые больше 127. У меня наибольшая проблема была не с выводом (методом print), а как раз с & (умножением) т.к. я умножал - 64 (192 в byte) и -1 (255 в byte) в итоге было найдено не совсем красивое но рабочее решение
(ip[i]&0xFF) & (mask[i]&0xFF)
Alukard Vampire hunter в The Hellsing
15 сентября, 20:36
Тож сегодня целый день курил статьи)
Дмитрий Малигон 23 уровень, Санкт-Петербург
12 октября, 19:02
0xFF- что значит, описано тут
Interstellar 36 уровень, Воронеж
14 сентября, 13:56
Почему ip[i] & mask[i] возвращает int, а не byte?
Булат Рахимов 33 уровень, Уфа
26 августа, 20:20
Я не понимаю, для чего в задаче переводят числа в byte. Чтобы у прошедших 20 уровней последние волосы повыпадали от напряжения мозга?
Константин 22 уровень, Санкт-Петербург
21 августа, 14:03
Реализовал метод getNetAddress, но ничего не понял😐 в цикле for( ..., i<ip.length; ...):
netAddres [i] = (byte) (ip[i] & mask[i]);  // <= Что здесь происходит??
Константин 22 уровень, Санкт-Петербург
21 августа, 14:14
Все, разобрался(перечитал лекцию🙃) — Побитовые операторы выполняют операцию над целыми числами побитово. — Это как? — Каждое число представляется в виде набора бит, а затем вычисляется результат по такой схеме: Если первый бит в обоих числах равен 1, то первый бит результата будет 1. Если второй бит в обоих числах равен 1, то второй бит результата будет 1. И так далее
print(ip);          //11000000 10101000 00000001 00000010
print(mask);        //11111111 11111111 11111110 00000000
print(netAddress);  //11000000 10101000 00000000 00000000
Дмитрий Пиминов 26 уровень, Усть-Илимск
13 августа, 09:04
https://habr.com/ru/post/225901/ - полезная статья
Василий Бабин 28 уровень, Москва
15 июля, 13:29
Подумал применить substring и toBinaryString, что-то никак не получалось. Так как в byte отрицательно -64 это 11000000, то есть -128 (11000000) и плюс к нему +64 (01000000) итого -128 + 64 = -64 итого 11000000. А toBinaryString принимает только int, -64 это уже -2 147 483 648 + 2 147 483 584 = -64, но это уже не 11000000, а 11111111111111111111111111000000. Ну, думаю обрежу 24 цифры и всё, а нет если цифра просто 2, то это просто 10, а не 00000000000000000000000000000010. В итоге ловишь исключение. Решил гулить. Нагуглил, что можно сделать через Syste.out.format (хотя если выводить, то всё равно четыре строки будет). Потом всё таки решил добить свой код и свою идею. В итоге, изменил тактику всё вышло с substring и toBinaryString с заменой подстроки (и даже строчек кодам мало 😉) , ещё я добавил переменную String с значением "00000000" для удобства.
Vad 32 уровень
1 июля, 16:29
https://ru.stackoverflow.com/questions/624319/%D0%9A%D0%B0%D0%BA-%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE-%D0%BA%D0%BE%D0%BD%D0%B2%D0%B5%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C-int-%D0%B2-binary Но лучше: for (byte b : bytes) { System.out.print(Integer.toBinaryString(b & 255 | 256).substring(1)+" "); } System.out.println(); }
Кощеев Алексей 24 уровень, Димитровград
5 августа, 11:22
Можешь, пожалуйста, объяснить что происходит в данном моменте: (b & 255 | 256)?
Vad 32 уровень
6 августа, 00:29
Сейчас уже точно не скажу, как это работает, но без этого зехера не получается стабильного вывода восьмибитового значения. Может вывсти и 7, и 9 бит.. Какой-то баг у метода. Объяснение смотри по ссылке в комменте ..)