Напишите программу которая в символьной строке заменяет все нули на единицы и наоборот python

В Питоне. Уровень A. Напишите программу, которая заменяет в символьной строке все точки на нули и все буквы X на единицы.
Введите строку: ..X.XX.
Двоичный код: 0010110
Уровень B. Напишите программу, которая выполняет инверсию битов в символьной строке: заменяет в ней все нули на единицы и наоборот.
Как поменять местами 0 и 1 в строке
Решил написать свою функцию для перевода числа из десятичной системы счисления в двоичную. На положительных числах все норм, но чтобы разобраться с отрицательными нужно после деления поменять местами нули и единицы в полученной строке, но я не знаю как (пробовал метод replace, но он заменяет только что то одно, то есть либо нули на единицы либо наоборот)
Можно проще сделать:
![]()
Site design / logo © 2022 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2022.6.10.42345
Нажимая «Принять все файлы cookie», вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Напишите программу которая в символьной строке заменяет все нули на единицы и наоборот python
Для начала представим себе, что данные в компьютерах хранятся в ячейках-«битах», каждое из которых может принимать 10 разных значений. В таком случае очень легко хранить положительные целые числа: каждое число по цифрам записывается в ячейки памяти. Реальный процессор может выполнять арифметические с такими числами, но есть проблема: чем больше цифр в числах, которые он сможет складывать за одну операцию (такт), тем сложнее его проектировать, тем больше тепла он выделяет и энергии потребляет. Поэтому необходимо выбрать некоторое фиксированную «стандартную» длину чисел так, чтобы с одной стороны для большей части основных задач числа туда помещались, с другой стороны были наиболее короткими. Например, можно выбрать длину в 10 цифр для «обычных» чисел и длину 20 для «длинных» (операций с длинными целыми числами за один такт процессора будет выполняться меньше). Кстати, нам потребуется хранить ещё и знак числа. Как лучше всего это сделать — вопрос очень хороший.
В реальности используется несколько подходов к хранению знака числа, вернее даже к хранению просто целых чисел. Самый «популярный» в данный момент называется «дополнение до двойки» (two’s complement), что для нашего воображаемого десятичного процессора превращается в «дополнение до десятки». Основная идея подхода состоит в следующем. Так как наши числа ограничены 10-ю цифрами, то если в результате арифметической операции возникнет перенос через разряд в 11-ю цифру, то он будет потерян. В таких случаях говорят, что вычисления производятся по модулю $10^<10>$. Пусть у нас есть два числа: отрицательное $x$ и положительное $y$, и нам нужно вычислить $x+y$. Заметим, что по замечанию выше $x+y\equiv (10^<10>+x) + y$ (ведь добавление лишнего $10^<10>$ ничего не меняет, у нас нет «места», чтобы хранить эту цифру). Но число $(10^<10>+x)$ уже заведомо положительное.
Итак, ровно в этом состоит идея: для хранения отрицательного числа $x$ используется положительное число $(10^<10>+x)$. Неотрицательные числа от 0000000000 до 4999999999 хранятся как есть. А числа от 5000000000 до 9999999999 отдаются отрицательным числам, причём $-1$ превращается в $10^<10>-1 = 9999999999$, $-2$ превращается в $10^<10>-2 = 9999999998$, и так далее, $-5000000000$ превращается в. в $-5000000000$. Заметим, что отрицательных чисел «поместилось» на одно больше, чем положительных.
Вот примеры: сложим $8\,512$ и $-3\,628$. $$10^<10>-3628 = 9\,999\,996\,372.$$ Далее $$8\,512 + (-3\,628) \equiv 8\,512 + 9\,999\,996\,372 = 10\,000\,004\,884 \equiv 4\,884.$$
Сложим $-6\,460$ и $-9\,290$. $$(-6\,460) + (-9\,290) \equiv (10^<10>-6\,460) + (10^<10>-9\,290) = 9\,999\,993\,540 + 9\,999\,990\,710 = $$ $$= 19\,999\,984\,250 \equiv 9\,999\,984\,250 \equiv 9\,999\,984\,250 — 10^ <10>= (-15\,750).$$
В чём выгода такого подхода? Во-первых, используются все возможные значения (если знак хранить в первой цифре, то будут «потеряны» 80% чисел). Во-вторых, с таким подходом отрицательные числа ничем не отличаются от положительных и не требуется усложнения схем для организации арифметических операций с ними. По модулю $10^<10>$ отлично работают все арифметические операции, поэтому работать будут и вычитание, и умножение.
В реальных чипах используется двоичная система счисления, но в остальном всё устроенно именно так. Один бит — это двоичная цифра. И существуют числа разной длины — в 8, 16, 32 и 64 двоичных цифры. Это зависит от реальных чипов.
Битовое представление целых чисел и битовые операции
Итак, переменные типа int хранятся в двоичной системе счисления в виде последовательности двоичных цифр — бит. Биты нумеруются от 0, биты будем записывать справа налево (то есть бит с номером 0 будет записан самым правым, а самый старший бит — самым левым).
Например, если a = 10 , то в битовой записи a биты с номерами 1 и 3 равны 1, а остальные биты равны 0.
В программах на языке Питон числа в двоичной системе счисления можно записывать в виде последовательностей из 0 и 1, предваряя их префиксом 0b . Например, допустимо присваивание a = 0b101 .
Для двух переменных одинакового скалярного типа определены битовые операции:
& битовое И (AND)
| битовое ИЛИ (OR)
^ битовое ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR)
битовое ОТРИЦАНИЕ (NOT) — унарная операция.
Битовые операторы работают следующим образом. Берутся два операнда, и к каждой паре соответствующих бит для левого и правого операнда применяется данная операция, результатом будет переменная того же типа, каждый бит которой есть результат применения соответствующей логической операции к соответствующим битам двух операндов. Рассмотрим пример:
Битовое отрицание числа (величина f в последнем примере) — это число, полученное из исходного заменой всех нулей на единицы и наоборот.
Применение побитового отрицания к неотрицательному числу даст отрицательное число, что связано с особенностями представления отрицательных чисел в виде дополнительного кода. Про это чуть ниже.
Есть еще две операции, работающие с битами: это битовые сдвиги. Их два: сдвиг влево и вправо. Оператор a >> n возвращает число, которое получается из a сдвигом всех бит на n позиций вправо, при этом самые правые n бит отбрасываются. Например:
Понятно, что для положительных чисел битовый сдвиг числа вправо на n равносилен целочисленному делению на 2 n . Для отрицательных чисел в языке Питон операции битового сдвига неприменимы.
Аналогично, битовый сдвиг влево на n бит равносилен (для положительных чисел) умножению на 2 n и осуществляется при помощи оператора << :
Тонкости битового представления целых чисел в Python
Как вам уже известно, целые числа в питоне ограничены лишь объёмом оперативной памяти, то есть могут быть весьма и весьма большими. В этом случае можно представлять себе битовую запись целых чисел так. Если число положительно, то слева от записи числа идёт бесконечное количество 0. А если число отрицательно, то слева идёт бесконечное количество 1. Число -1 записывается как последовательность из одних лишь единиц: -1 = . 111 , а число 0 — из одних лишь нулей 0 = . 000 . То есть 21, это не просто 10101 , а . 00010101 . Таким образом,
21 — это число вида . 11101010 , то есть бесконечное количество 1, а затем 01010 .
Как понять, какому целому числу соответствует такая запись? Если слева нули, то число положительно, и всё просто: отбрасываем ведущие нули, получаем число в двоичной записи. А если слева единицы? Для этого найдём самую правую 1, после которой слева идут только 1. В нашем примере получится вот такая единица: 100000 . Очевидно, что в двоичной записи после такой единицы сразу идёт 0 (кроме случая, когда в двоичной записи вообще только 1, то есть кроме числа -1). Таким образом, число разбивается на бесконечную «голову» единиц . 11100000 и хвост после первого нуля (возможно пустой) — 1010 . Итоговое число равно их разности: . 11101010 = 0b1010 — 0b100000 = -22 .
Заметим, что для любого целого числа x сумма x +
x — это бесконечная последовательность единиц. Это то самое число -1. То есть в питоне
Упражнения
Во всех упражнениях (если не оговорено иное) нельзя использовать арифметические операторы сложения, умножения, вычитания, деления, взятия остатка. Вместо них используем побитовые операторы & , | ,
A: 2 k
Дано число k, 0⩽k⩽31. Запишите число 2 k , то есть число, у которого k-й бит равен 1, а остальные — нули.