Обычно это реализуется с помощью вычитания с обнаружением переноса.
С точки зрения стробирования вычитание двоичных чисел выполняется путем передачи согласованных пар битов из каждого операнда через вычитатель:
+-----+
carry_in -->| |
| |--> a_minus_b
a -->| SUB |
| |--> carry_out
b -->| |
+-----+
a_minus_b = carry_in ⊕ a ⊕ b
carry_out = (carry_in ∧ b) ∨ (¬a ∧ (carry_in ∨ b))
Бит 0 из аргументов a
и b
передается через первый вычитатель, с carry_in, равным 0. Бит 1 из каждого аргумента передается через второй вычитатель, при этом для carry_in установлено значение carry_out этапа бит-0.,Это продолжается в цепочке до тех пор, пока окончательное значение carry_out в конце не установит флаг переноса ЦП, который содержит 1, если a Кроме того, каждый a_minus_b объединяется в OR и сводится к нулю, а результат идетв нулевой флаг процессора, означающий, что a = b.
Эти флаги могут быть проверены машинными инструкциями, которые генерируются компиляторами, когда вы пишете if (a < b) { ... }
.
Я оставлю 5> 3 в качестве упражнения для читателя.