Инструкция DCPU-16 DIV

Я смотрю на спецификацию для DCPU-16, и у меня возникают проблемы с пониманием цели значения переполнения с помощью инструкции DIV:

DIV a, b - устанавливает a в a/b, устанавливает O в ((a<<16)/b)&0xffff.

Кто-нибудь может объяснить семантическое значение O здесь, для чего это было бы полезно?

2 ответа

Решение

Похоже, O дает дробную часть результата (в виде числа с фиксированной запятой). Например, рассмотрим 5 / 2:

a = 5 / 2 = 2 (integer part)
O = ((5 << 16) / 2) & 0xffff = (327680 / 2) & 0xffff = 32768

Если вы рассматриваете O как 16 двоичных дробных цифр, то это представляет 0,5 дробную часть результата.

Другой способ посмотреть на это - двоичный результат в битах:

aaaaaaaaaaaaaaaa.OOOOOOOOOOOOOOOO

5/2 это

0000000000000010.1000000000000000

Как видно из проверки, этот результат сдвигается на 5 (101 двоичный) вправо на один бит в дробные биты.

((a<<16)/b) даст вам 16-битную дробную часть деления.

Это проще увидеть в базе 10: если мы хотим найти первые три дробные цифры, скажем, 5/3, мы можем переместить 5 на три позиции (5000), разделить их на 3, а затем взять последние три целых цифры. 5000/3 - 1666, поэтому первые три цифры после десятичной дроби 5/3 - 0,666.


Это работает, потому что "перемещение 5 на одну цифру" аналогично "умножению на 10", а умножение / деление являются коммутативными (порядок можно поменять местами), поэтому (5 * 1000) / 3 знак равно (5 / 3) * 1000 знак равно 1.6666... * 1000 знак равно 1666.666...,

Другими словами, сдвиг 5 на несколько цифр и деление на 3 - это то же самое, что сдвиг (5/3) на пару цифр.

Другие вопросы по тегам