Прежде всего, я даже не думаю, что эта функция верна:
false
Он возвращается, false
когда умножение будет переполняться, но оно также возвращается, 0x10000
когда умножение не переполняется. Например, если заданы a = 0x8000
и b = false
, эта функция возвращается, 0x80000000
хотя результат a * b 0x1ffff
соответствует 32 битам. Но если изменить а и Ь к 0xffff
и addition_is_safe
(которые имеют ту же самую «высокую один битую позицию») , то умножьте на самом деле делает переполнение. Но вы не могли сказать, просто используя самую высокую позицию бит. Вам нужно будет посмотреть больше, чем просто верхний бит, чтобы выяснить, будет ли переполнение переполняться. Фактически, вам нужно будет сделать часть или все фактическое умножение, чтобы выяснить правильный ответ.
Аналогичным образом, вы можете построить функцию, addition_is_safe
которая обнаруживает «возможные переполнения» (как в положительном, так и в отрицательном направлении) с использованием битовых позиций. Но вы не можете обнаружить «фактическое переполнение», если вы не выполняете часть или все фактическое дополнение.
Я считаю, что в худшем случае вы будете вынуждены делать все возможное умножение или добавление, поэтому я не уверен, что вы ничего сохраните, не давая машине просто сделать полное умножение / дополнение для вас.