Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Работа в дополнительных кодах

Кирилл Груздев Ученик (51), открыт 13 часов назад
Здравствуйте, помогите умножить 1.011110(-66) на 0.1000111(71) друг на друга в дополнительных кодах,числа уже в доп коде,цифра до запятой это знаковый разряд,с использованием сдвигов и сложения и показать весь процесс,спасибо
2 ответа
Степан Вставичеров(Холинский) Профи (981) 12 часов назад
Назвался груздем - полезай в кузов
Кирилл ГруздевУченик (51) 12 часов назад
оригинально
Степан Вставичеров(Холинский) Профи (981) Кирилл Груздев, пишется "оригЕнально". И ты еще в доп.кодах собрался работать?!
Кирилл ГруздевУченик (51) 12 часов назад
довольно странно отдыхать,оскорбляя других людей
Степан Вставичеров(Холинский)Профи (981) 12 часов назад
Хотя не, в падлу лезть)))
GGG Просветленный (32465) 9 часов назад
Дано:
Множитель (A): 1.011110 (это число -66 в дополнительном коде)
Множимое (B): 0.1000111 (это число 71 в дополнительном коде)
Понимание формата чисел:

Цифра до запятой — это знаковый разряд. Значит, запятая разделяет знаковый бит и остальные разряды.
Числа представлены в 8-битном формате (1 знаковый бит + 7 битов данных).
Шаг 1: Приведение чисел к двоичному виду без разделителя для удобства работы.

Число A (-66):
 1.011110  -->  10111110 
Число B (71):
 0.1000111  -->  01000111 
Шаг 2: Проверка чисел и их соответствия десятичным значениям.
Для A:
Поскольку знаковый бит равен 1, число отрицательное.
Находим модуль числа:
 Инвертируем биты (кроме знакового): 0111110 --> 1000001 
Добавляем 1: 1000001 + 1 = 1000010
Десятичное значение: 66
Значит, число A = -66
Для B:
Знаковый бит равен 0, число положительное.
Десятичное значение:
 1000111 
Десятичное значение: 64 + 4 + 2 + 1 = 71
Шаг 3: Подготовка к умножению.
Нам нужно умножить -66 на 71.

Шаг 4: Расширение чисел до 16 бит для корректной обработки переполнения.
Расширяем число A до 16 бит с учетом знакового расширения:
 10111110 --> 11111111 10111110 
Число B остается как есть, но для умножения нам понадобятся его биты:
 01000111 
Шаг 5: Выполнение умножения с использованием сдвигов и сложения.
Представляем множитель B по битам (от младшего к старшему):
 Бит 0 (LSB): 1 
Бит 1: 1
Бит 2: 1
Бит 3: 0
Бит 4: 0
Бит 5: 0
Бит 6: 1
Бит 7 (MSB): 0
Процесс умножения:

Для каждого бита множителя B:

Если бит равен 1, добавляем к аккумулятору множимое A, сдвинутое влево на позицию этого бита.
Используем знаковое расширение при сдвиге множимого A.
Шаги сложения:

Бит 0 (позиция 0):

Бит равен 1.
Сдвиг A на 0 позиций: 11111111 10111110
Аккумулятор: 0 + 11111111 10111110 = 11111111 10111110
Бит 1 (позиция 1):

Бит равен 1.
Сдвиг A на 1 позицию: 11111111 01111100
Аккумулятор: 11111111 10111110 + 11111111 01111100
Бит 2 (позиция 2):

Бит равен 1.
Сдвиг A на 2 позиции: 11111110 11111000
Аккумулятор: сумма предыдущего результата и текущего сдвига.
Биты 3-5:

Биты равны 0.
Пропускаем эти шаги.
Бит 6 (позиция 6):

Бит равен 1.
Сдвиг A на 6 позиций: 11111110 00000000
Аккумулятор: добавляем к предыдущему результату.

Шаг 6: Подсчет итогового значения аккумулятора.
После выполнения всех сложений получаем итоговый аккумулятор.
Поскольку все операции выполнялись с учетом знака, итоговое значение будет корректным.

Шаг 7: Получение окончательного результата и проверка.
Итоговое значение аккумулятора представляет произведение -66 * 71.
Вычисляем произведение в десятичной системе для проверки:
 -66 * 71 = -4686 
Преобразуем двоичный результат аккумулятора в десятичное число и убеждаемся, что оно равно -4686.

Заключение:
Мы успешно умножили два числа в дополнительных кодах с использованием сдвигов и сложения.
Итоговое произведение: -4686
GGGПросветленный (32465) 9 часов назад
           01000010  (66) 
× 01000111 (71)
----------
01000010 (66) ← бит 0: 1
10000100 (132) ← бит 1: 1 (сдвиг на 1)
00010000 1000 (264) ← бит 2: 1 (сдвиг на 2)
00000000 (0) ← бит 3: 0
00000000 (0) ← бит 4: 0
00000000 (0) ← бит 5: 0
01000010 000000 (4224) ← бит 6: 1 (сдвиг на 6)
----------
01000101 01011010 (4686)
Похожие вопросы