Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/121: Рейтинг темы: голосов - 121, средняя оценка - 4.64
4 / 4 / 5
Регистрация: 25.05.2014
Сообщений: 50

Инвертировать биты

14.04.2015, 22:13. Показов 23802. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу для обучения небольшой класс на Python для работы с адресами и масками ipv4.

Хранится ip-адрес в виде списка, где каждый элемент это октет в двоичном виде в формате строки.
Например [11111111,11111111,11100000,00000000]

Сейчас ищу способ просто инвертировать биты в октете для нахождения адреса возможных ip-адресов.
Нагуглил операцию ~ но не могу её правильно применить.
Написал:
Python
1
bin(~int(self.addrBin[i],2) )[3:].zfill(8))
addrBin это список. Работает не так как надо.
Как сделать инвертирование? (Например 01010 - > 10101)
Можно ли хранить биты в каком-то другом виде, кроме строк?

Полный код класса:
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# -*- coding: UTF-8 -*-
class Ip4addr:
  
  addrBin = []
  
  def __init__(self,x = None):
    if (x is None):
      self.addrBin = []
      return
    
    if (x.find(".")):
      x = x.split(".")
      self.addrBin = []
      for i in x:
    self.addrBin.append(int(i))
    else:
      self.addrBin = x[:]
    #Сразу конвертнем в бинарное
    self.toBin()
    return
  
  def toBin(self):
    for j,i in enumerate(self.addrBin):
      self.addrBin[j] = bin(i)[2:].zfill(8)
    return
  
  def toDec(self):
    for j,i in enumerate(self.addrBin):
      self.addrBin[j] = int(str(i),2)
    return
 
  def getNetAddr(self,mask):
    netAddress = Ip4addr()
    for i in range(0,len(self.addrBin)):
      t = int(self.addrBin[i],2) & int(mask.addrBin[i],2)
      netAddress.addrBin.append(bin(t)[2:].zfill(8))
    return netAddress
  
  def getFirstNetAddr(self,mask):
    netAddr = self.getNetAddr(mask)
    netAddr.addrBin[-1] = bin(int( netAddr.addrBin[-1],2) | 0b1)[2:].zfill(8)
    return netAddr
  
  def getLastNetAddr(self,mask):
    netAddr = self.getNetAddr(mask) 
    #далее мы берем адрес, обратный маске 0->1, 1->1 и через OR
    reverseMask = Ip4addr()
    for i in range(0,len(self.addrBin)):
      print(self.addrBin[i])
      reverseMask.addrBin.append(bin(~int(self.addrBin[i],2) )[3:].zfill(8))
      print(reverseMask.addrBin[-1])
    
    
    return netAddr
 
  def getBitMaskSize(self):
    s = ''.join(map(str,self.addrBin))
    s = s.split("0")
    return len(s[0])
  
  def printBin(self):
    print('.'.join(map(str,self.addrBin)))
    return
  
  def printDec(self):
    self.toDec()
    print('.'.join(map(str,self.addrBin)))
    self.toBin()
    return
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.04.2015, 22:13
Ответы с готовыми решениями:

Инвертировать цвета в pandas heatmap
Как инвертировать цвета в pandas heatmap относительно 0. Или по крайней мере сделать черное светлее. скрин здесь: ...

Разделение байта на биты
Необходимо побитово считать файл. file.read(1) помогает считать побайтово, но тогда возникает вопрос, как каждый байт перевести в...

Перевод строки в биты
Здравствуйте! Делаю программу, которая находит в файле с ip адресами Longest-Prefix Match. Сейчас она работает со строками def...

6
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
14.04.2015, 23:05
Python
1
2
3
4
5
6
7
8
9
10
>>> a
['11111111', '11111111', '11100000', '0']
>>> b
[]
>>> for oct in a:
...     b.append(str(format(int(oct,2)^255,'#010b'))[2:])
...
>>> b
['00000000', '00000000', '00011111', '11111111']
>>>
Но мне кажется, что нужно изначально хранить двоичные числа в двоичном представлении, в крайнем случае ip можно представить в виде integer. И этот модуль уже написан.
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
14.04.2015, 23:24
Цитата Сообщение от Jabbson Посмотреть сообщение
for oct in a:
Не хорошо перекрывать имена встроенных функций....

https://docs.python.org/3/libr... s.html#oct
0
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
14.04.2015, 23:25
Согласен, косяк)
0
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
14.04.2015, 23:34
Python
1
'{:08b}'.format(int(addrBin[i],2).__xor__(255))
==
Python
1
format(int(addrBin[i],2).__xor__(255),'08b')
2
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
14.04.2015, 23:47
Лучший ответ Сообщение было отмечено Centrin0 как решение

Решение

Еще инвертировать биты в формате стрингов можно так

Python
1
2
3
4
5
6
7
8
9
>>> num = '11110000'
>>> new = ''
>>>
>>> for x in range(0, len(num)):
...     new += '0' if int(num[x]) else '1'
...
>>> new
'00001111'
>>>
1
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
15.04.2015, 14:07
Простейший способ, для вашего случая:
Python
1
256 - i
где i - десятичное представление.

Добавлено через 6 часов 31 минуту
Ой, там 255 надо, конечно
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.04.2015, 14:07
Помогаю со студенческими работами здесь

Побайтовое чтение файла и перевод в биты
в общем есть файл, я его открываю на чтение от так f = open(name, 'rb') a = f.read(4) ну вот допустим я читаю 4 первых байта ...

OpenCV инвертировать черно-белую картинку
Здравствуйте. Есть черно-белая картинка (именно черно-белая, а не оттенки серого), нужно её инвертировать. Поиск в FAQ ничего не дал. ...

Найти информационные биты в кодовой комбинации
Нужно найти информационные биты в данном коде, можно даже показать мне это на скриншоте для наглядности Буду рад любой помощи ...

Написать программу, которая переводит биты в килобайты
Написать программу, которая переводит биты в килобайты.

Программа для перевода мегабайт в килобайты,байты в биты
Составить программу перевода мегабайт в килобайты, байты и биты.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru