Форум » Адресация в Интернете » Задание 13 (10580) kompege » Ответить

Задание 13 (10580) kompege

Indo1es2: Добрый день! Почему при вычислении двоичной записи маски с помощью f строки ответом будет число 13 и при этом очевидно что первые четыре нуля не считаются. Но ведь в ip адресе и адресе сети хранится 32 бита. Во втором случае будет ответ 299 и получается что там посчитаны первые 4 разрада ip-адреса. [pre2] ip_address = '10.48.96.0' subnet_mask = '255.255.240.0' network = IPv4Network(f'{ip_address}/{subnet_mask}') count = 0 # перебираем все адреса в сетиfor ip in network: binary_ip_2 = f'{ip:b}' #binary_ip = bin(int(ip))[2:] ones_count = binary_ip.count('1') zero_count = binary_ip.count('0') if ones_count > zero_count: count += 1 print(f'Количество адресов с чётной суммой единиц: {count}') [/pre2] Как объяснить детям почему мы берем и у 32-битного значения убираем первые 4 бита?

Ответов - 4

Ж: [quoteКак объяснить детям почему мы берем и у 32-битного значения убираем первые 4 бита?] Биты никуда не убираются. В вашем коде надо добавить "достраивание" двоичного кода до 32-битного состояния: binary_ip = bin(int(ip))[2:].zfill(32) Тогда программа даст верный ответ. Вообще, я бы детям сначала показала, как решать эти задачи без библиотеки ipaddress, руками Адрес сети адрес и маски выглядят так ['00001010', '00110000', '01100000', '00000000'] ['11111111', '11111111', '11110000', '00000000'] Маска содержит 20 единиц, значит, адрес сети также хранится в первых 20 битах, последние 12 приходятся на адрес узла [pre2] from itertools import * adres='10.48.96.0'; print( [ bin(int(ip))[2::].zfill(8) for ip in adres.split('.') ] ) adres='255.255.240.0'; print( [ bin(int(ip))[2::].zfill(8) for ip in adres.split('.') ] ) ['00001010', '00110000', '01100000', '00000000'] ['11111111', '11111111', '11110000', '00000000'] k=0 for c in product('01',repeat=12): ad='00001010'+'00110000'+'0110'+''.join(c) if ad.count('1')>ad.count('0'): k+=1 print(k,ad) [/pre2]

Indo1es2: Спасибо! Мне нужно кое-что осознать и чувствую что вернсь с вопросом. То что Вы написали я знаю, но видимо что-то скрывается от моего знания и опыта, так как прирешении других заданий такой трудности не возникало. Потестирую.

Ж: Может быть, будет полезно следующее: [pre2] from ipaddress import * for ip in IPv4Network(f'10.48.96.0/255.255.240.0'): b_ip = f'{int(ip):b}'.zfill(32) if b_ip.count('1')>b_ip.count('0'): print(ip,f'{int(ip):b}', [bin(int(ip1))[2::] for ip1 in str(ip).split('.')],f'{int(ip):b}'.zfill(32),[bin(int(ip1))[2::].zfill(8) for ip1 in str(ip).split('.')]) [/pre2] программа выводит строки, в которых: 1) адрес узла сети 2) адрес в двоичной сс без дополнительных ведущих нулей для достраивания до 32 битов 3) адрес в двоичной сс без дополнительных ведущих нулей для достраивания до 32 битов , разделенный на отдельные байты - видно, что они не восьмибитные 4) адрес в двоичной сс с доп. ведущими нулями для достраивания до 32 битов 5) адрес в двоичной сс с доп. ведущими нулями для достраивания до 32 битов , разделенный на отдельные байты - видно, что они восьмибитные ТАКИМ ОБРАЗОМ, для обработки ip-адреса надо обязательно добавить в него недостающие ведущие нули с помощью функции z.fill(32) 10.48.103.255 1010001100000110011111111111 ['1010', '110000', '1100111', '11111111'] 00001010001100000110011111111111 ['00001010', '00110000', '01100111', '11111111'] 10.48.107.255 1010001100000110101111111111 ['1010', '110000', '1101011', '11111111'] 00001010001100000110101111111111 ['00001010', '00110000', '01101011', '11111111'] 10.48.109.255 1010001100000110110111111111 ['1010', '110000', '1101101', '11111111'] 00001010001100000110110111111111 ['00001010', '00110000', '01101101', '11111111'] 10.48.110.255 1010001100000110111011111111 ['1010', '110000', '1101110', '11111111'] 00001010001100000110111011111111 ['00001010', '00110000', '01101110', '11111111'] 10.48.111.127 1010001100000110111101111111 ['1010', '110000', '1101111', '1111111'] 00001010001100000110111101111111 ['00001010', '00110000', '01101111', '01111111'] 10.48.111.191 1010001100000110111110111111 ['1010', '110000', '1101111', '10111111'] 00001010001100000110111110111111 ['00001010', '00110000', '01101111', '10111111'] 10.48.111.223 1010001100000110111111011111 ['1010', '110000', '1101111', '11011111'] 00001010001100000110111111011111 ['00001010', '00110000', '01101111', '11011111'] 10.48.111.239 1010001100000110111111101111 ['1010', '110000', '1101111', '11101111'] 00001010001100000110111111101111 ['00001010', '00110000', '01101111', '11101111'] 10.48.111.247 1010001100000110111111110111 ['1010', '110000', '1101111', '11110111'] 00001010001100000110111111110111 ['00001010', '00110000', '01101111', '11110111'] 10.48.111.251 1010001100000110111111111011 ['1010', '110000', '1101111', '11111011'] 00001010001100000110111111111011 ['00001010', '00110000', '01101111', '11111011'] 10.48.111.253 1010001100000110111111111101 ['1010', '110000', '1101111', '11111101'] 00001010001100000110111111111101 ['00001010', '00110000', '01101111', '11111101'] 10.48.111.254 1010001100000110111111111110 ['1010', '110000', '1101111', '11111110'] 00001010001100000110111111111110 ['00001010', '00110000', '01101111', '11111110'] 10.48.111.255 1010001100000110111111111111 ['1010', '110000', '1101111', '11111111'] 00001010001100000110111111111111 ['00001010', '00110000', '01101111', '11111111']


Indo1es2: Спасибо!



полная версия страницы