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

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

14.04.2015, 22:13. Показов 23660. Ответов 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
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,181
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru