Существует ли более быстрый способ разделиться на 2, со знаком, в блоке, чем тот в примере ниже?
...
mov ecx, 2
idiv ecx
push eax #push the result
...
Конечно:
sar eax, 1
SAR
OPCode отличается от SHR
в том, что наиболее значимый (знак) бит сохраняется в SAR
, и он установлен на 0 в ШР
. Страница Arithmetic Shift на странице на Википедии показывает гораздо более подробную информацию об этой операции в общем контексте.
Обратите внимание, что на 2-х комплектном компьютере (который X86) это на самом деле рассчитывает пол (EAX / 2)
. В частности, это означает, что для целого числа x :
Последний результат дает результаты, которые могут быть неожиданными. Например, -3 SAR 1 приводит к -2, а не -1. С другой стороны, 3 SAR 1 приводит к 1.