Способы представлений чисел в ЭВМ
Целые числа
Прямой код. Прямой код двоичного числа совпадает по изображению с записью самого числа. Значение знакового разряда для положительных чисел равно 0, а для отрицательных чисел 1.Обратный код. Обратный код для положительного числа совпадает с прямым кодом. Для отрицательного числа все цифры числа заменяются на противоположные (1 на 0, 0 на 1), а в знаковый разряд заносится единица.
Дополнительный код. Дополнительный код положительного числа совпадает с прямым кодом. Для отрицательного числа дополнительный код образуется путем получения обратного кода и добавлением к младшему разряду единицы.
В любом представлении старший бит определяет знак числа:
0 — положительное число;
1 — отрицательное число
Пример.
Для числа +1101
:
Прямой код | Обратный код | Дополнительный код |
0,0001101 | 0,0001101 | 0,0001101 |
Для числа -1101
:
Прямой код | Обратный код | Дополнительный код |
1,0001101 | 1,1110010 | 1,1110011 |
Вещественные числа (числа с плавающей точкой)
Все равные по абсолютному значению положительные и отрицательные числа отличаются только этим битом. В остальном числа с разным знаком полностью одинаковы. Для представления отрицательных чисел здесь не используется дополнительный код.Поле мантиссы содержит мантиссу нормализованного числа.
Одинарная точность:
1.(цифры мантиссы)*2 (P-127)
Двойная точность:
1.(цифры мантиссы)*2(P-1023)
Расширенная точность:
1.(цифры мантиссы)*2(P-16383)
Перейти к онлайн решению своей задачи
Пример.
Запишите код действительного числа, интерпретируя его как величину типа Double.
а) 446,15625;
Переводим десятичное число в двоичное представление.
Целая часть от деления |
Остаток от деления |
446 div 2 = 223 |
446 mod 2 = 0 |
223 div 2 = 111 |
223 mod 2 = 1 |
111 div 2 = 55 |
111 mod 2 = 1 |
55 div 2 = 27 | 55 mod 2 = 1 |
27 div 2 = 13 |
27 mod 2 = 1 |
13 div 2 = 6 |
13 mod 2 = 1 |
6 div 2 = 3 |
6 mod 2 = 0 |
3 div 2 = 1 |
3 mod 2 = 1 |
1 div 2 = 0 |
1 mod 2 = 1 |
Остаток от деления записываем в обратном порядке. Получаем число в 2-ой системе счисления:
110111110
446 = 1101111102
Для перевода дробной части числа последовательно умножаем дробную часть на основание 2. В результате каждый раз записываем целую часть произведения.
0.15625*2 = 0.313 (целая часть 0)
0.313*2 = 0.626 (целая часть 0)
0.626*2 = 1.252 (целая часть 1)
0.252*2 = 0.504 (целая часть 0)
0.504*2 = 1.008 (целая часть 1)
Получаем число в 2-ой системе счисления: 00101
0.15625 = 001012
446.15625 = 110111110,001012 = 1,1011111000101*28
Знак S = 0
Порядок P = 8 + 1023 = 103110 = 100000001112
Мантисса: 1011111000101
Для числа с двойной точностью мантисса занимает 52 разряда. Добавляем нули.
Мантисса: 1011 1110 0010 1000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Запишем число:
0 10000000111 1011 1110 0010 1000 0000 0000 0000 0000 0000 0000 0000 0000 0000
В шестнадцатеричной системе счисления: 407BE2800000000016
б) -455,375.
Переводим десятичное число в двоичное представление.
Целая часть от деления |
Остаток от деления |
455 div 2 = 227 |
455 mod 2 = 1 |
227 div 2 = 113 |
227 mod 2 = 1 |
113 div 2 = 56 |
113 mod 2 = 1 |
56 div 2 = 28 |
56 mod 2 = 0 |
28 div 2 = 14 |
28 mod 2 = 0 |
14 div 2 = 7 |
14 mod 2 = 0 |
7 div 2 = 3 |
7 mod 2 = 1 |
3 div 2 = 1 |
3 mod 2 = 1 |
1 div 2 = 0 |
1 mod 2 = 1 |
Остаток от деления записываем в обратном порядке. Получаем число в 2-ой системе счисления: 111000111
455 = 1110001112
Для перевода дробной части числа последовательно умножаем дробную часть на основание 2. В результате каждый раз записываем целую часть произведения.
0.375*2 = 0.75 (целая часть 0)
0.75*2 = 1.5 (целая часть 1)
0.5*2 = 1 (целая часть 1)
0*2 = 0 (целая часть 0)
Получаем число в 2-ой системе счисления: 0110
0.375 = 01102
455,375 = 111000111,01102 = 1,110001110110*282
Знак S = 1
Порядок P = 8 + 1023 = 1031
Мантисса: 1100 0111 0110 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Запишем число:
1 10000000111 1100 0111 0110 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
В шестнадцатеричной системе счисления: -455,375 = C07C76000000000016
Дан код величины типа Double. Преобразуйте его число.
а) 408B894000000000;
Представим в двоичном коде:
010000001000 1011 1000 1001 0100 0000 0000 0000 0000 0000 0000 0000 0000 0000
где
S = 0 (положительное число)
P = 100000010002 = 1032 – 1023 = 9
M = 10111000100101
N = 1,10111000100101
С учетом P = 9, N = 1101110001,00101
1101110001 = 29*1 + 28*1 + 27*0 + 26
*1 + 25*1 + 24*1 + 23*0 + 22*0+ 21*0 + 20*1 = 512 + 256 + 0 + 64 + 32 + 16 + 0 + 0 + 0 + 1 = 881Для перевода дробной части необходимо разделить разряд числа на соответствующую ему степень разряда
00101 = 2-1*0 + 2-2*0 + 2-3*1 + 2-4*0 + 2-5*1 = 0.15625
Ответ: 881,15625
б) C089930000000000.
Представим в двоичном коде:
1 10000001000 100110010011000000000000000000000000 0000 0000 0000 0000
где
S = 1 (отрицательное число)
P = 100000010002 = 1032 – 1023 = 9
M = 100110010011
N =1,100110010011
С учетом P = 9, N = 1100110010,011
1100110010 = 29*1 + 28*1 + 27*0 + 26*0 + 25*1 + 24*1 + 23*0 + 22*0 + 21*1 + 2
Для перевода дробной части необходимо разделить разряд числа на соответствующую ему степень разряда
011 = 2-1*0 + 2-2*1 + 2-3*1 = 0. 375
Ответ: -818,375
Двоичная арифметика python — Stack Overflow на русском
Вопрос задан
Изменён 2 года 1 месяц назад
Просмотрен 9k раз
У меня следующее задание: реализовать двоичную арифметику (сложение, вычитание, сравнение) на python без библиотек. Я реализовал сложение следующим образом:
number1 = str(input("Введите первое число в 2ой системе: ")) number2 = str(input("Введите второе число в 2ой системе: ")) intSum = int(number1, 2) + int(number2, 2) result = bin(intSum)[2:] print(result)
Загвоздка в том, что мне дана подсказка: «генерировать число с 7,8 разрядов и каждое число записывать в массивы А и В». Что мне нужно переделать? Я совсем не понимаю, чего от меня хотят в подсказке
- python
- арифметика
вы не первый, кто сегодня хочет двоичную арифметику на питоне 🙂
на счет вопроса — вам же сказано — хранить число в массиве и работать с массивом чисел 0/1, а вы считили — строку перевели в число, а потом обратно в строку
нет уж — делайте все до конца как требуется
# получить бинарное число в виде массива чисел (бит) num1 = [*map(int, input("Введите первое число в 2ой системе: "))] num2 = [*map(int, input("Введите второе число в 2ой системе: "))] # перевернуть числа для удобства выполнения операций num1 = num1[::-1] num2 = num2[::-1] # дополнить числа нулями size = max(len(num1), len(num2)) num1 += [0] * (size - len(num1)) num2 += [0] * (size - len(num2)) # сложить 2 числа overflow = 0 res = [] for obj in zip(num1, num2): value = obj[0] + obj[1] + overflow overflow = value // 2 res.append(value % 2) # если флаг переполнения установлен - добавить бит в начало нового числа if overflow == 1: res.append(1) # перевернуть число назад res = res[::-1] print(''.join(map(str, res)))
5
От вас хотят чтобы вы сами рализовали операции в двоичной арифметике, а не преобразовали число средствами питон. Т.е. нужно хранить число побитово (именно об этом требование «записывать в массивы») и с числами в таком представлении уже оперировать.
Зарегистрируйтесь или войдите
Регистрация через Google
Регистрация через Facebook
Регистрация через почту
Отправить без регистрации
Почта
Необходима, но никому не показывается
Отправить без регистрации
Почта
Необходима, но никому не показывается
Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки
Программа Python для сложения двух двоичных чисел
Улучшить статью
Сохранить статью
- Уровень сложности: Easy
- Последнее обновление: 06 фев, 2023
Улучшить статью
Сохранить статью
Имея два двоичных числа, напишите программу на Python для вычисления их суммы.
Примеры:
Ввод: a = "11", b = "1" Выход: "100" Ввод: а = "1101", б = "100" Вывод: 10001
Подход:
- Наивный подход: Идея состоит в том, чтобы начать с последних символов двух строк и вычислять сумму цифр один за другим. Если сумма становится больше 1, сохраняем перенос для следующих цифр.
- Использование встроенной функции: Вычислить результат с помощью встроенной функции bin() и int() .
Метод 1: Наивный подход:
Идея состоит в том, чтобы начать с последних символов двух строк и последовательно вычислять сумму цифр. Если сумма становится больше 1, сохраняем перенос для следующих цифр.
Python3
|
Выход
10001
Временная сложность : O(n)
Пространственная сложность : O(n)
Метод 2: Используя встроенные функции: ) функция в питоне. Функция int() в Python и Python3 преобразует число в заданной системе счисления в десятичное. Затем мы добавим его, а затем снова преобразуем в двоичное число, используя функцию bin() .
Example 1:
Python3
|
Output
10001
Example 2:
Python3
"0072 |
Output
10001
Method: Using “add” operator
Python3
|
Output
0b10001
Time complexity : O(n)
Space Complexity : O(1)
Статьи по теме
Часть B.
Сложение двоичных чисел Часть B. Сложение двоичных чиселСледующий: Что сдать: Вверх: Без названия Предыдущий: Часть A — Манипулирование
Если бы мы складывали вручную два двоичных числа, скажем, 1001 (это 9 в десятичном виде или с основанием 10). записи) и 1111 (это 15 в десятичной системе счисления), мы записывали их одну под другой, а затем складывали столбец за столбцом, начиная справа и сохраняя отслеживать то, что переносится в следующий столбец. Например, чтобы сложить 1001 и 1111, мы начинаем с 9.0660
и добавьте крайний правый столбец. 1+1 равно 10 в двоичном формате (2 в десятичном), поэтому мы пишем вниз 0 и перенесите 1 в следующий столбец, чтобы получить
Теперь добавляем вторую колонку справа. 1+0+1 равно 10 в двоичном формате (2 в десятичном), поэтому мы записываем 0 и переносим 1 в следующий столбец, чтобы получить
Добавляем третий столбец с аналогичными результатами:
Добавляя четвертый столбец, мы получаем 1+1+1 или 11 в двоичном виде (3 в десятичном), поэтому мы запишите 1 и несите 1, чтобы получить
И теперь мы суммируем (новый) пятый столбец, чтобы получить окончательный ответ
Обратите внимание, как это похоже на сложение двух десятичных чисел (с основанием 10). Для десятичные числа, мы по-прежнему добавляем столбец за столбцом, начиная справа. сумма двух цифр в столбце (плюс перенос из предыдущего столбец) находится между 0 и 19, поэтому мы записываем цифру от 0 до 9 и несите 0 или 1.
Рассмотрите возможность использования строк 0 и 1 для представления двоичных чисел, например. "1001" для представления двоичного числа 1001 или "1111" для представления двоичного номер 1111.
- Напишите программу Тьюринга, которая принимает на вход две такие «двоичные строки», а затем выводит
строка, представляющая их общее количество. Чтобы упростить задачу, убедитесь, что две входные строки
имеют одинаковую длину. Вот как должен выглядеть результат запуска этой программы:
Введите 2 двоичных числа в виде строк: "1001" "1111" Сумма двоичных чисел 1001 и 1111 равна 11000.
Убедитесь, что ваша программа работает с произвольными двоичными строками, а не только с теми, приведены в качестве примеров. - После того, как программа из части 1 будет работать правильно, измените ее так, чтобы она повторялась запрашивает и принимает две строки и выводит их общее количество.