Блок быстрое подразделение 2

Существует ли более быстрый способ разделиться на 2, со знаком, в блоке, чем тот в примере ниже?

...
mov ecx, 2
idiv ecx
push eax #push the result
...
7
задан Pascal Cuoq 10 January 2010 в 10:25
поделиться

1 ответ

Конечно:

sar eax, 1

SAR OPCode отличается от SHR в том, что наиболее значимый (знак) бит сохраняется в SAR , и он установлен на 0 в ШР . Страница Arithmetic Shift на странице на Википедии показывает гораздо более подробную информацию об этой операции в общем контексте.

Обратите внимание, что на 2-х комплектном компьютере (который X86) это на самом деле рассчитывает пол (EAX / 2) . В частности, это означает, что для целого числа x :

  • для x = 0 , результат составляет 0
  • для x> 0 , Результат Этаж (x / 2)
  • для x <0 , результат также пол (x / 2) , или -Ceil (- X / 2)

Последний результат дает результаты, которые могут быть неожиданными. Например, -3 SAR 1 приводит к -2, а не -1. С другой стороны, 3 SAR 1 приводит к 1.

21
ответ дан 6 December 2019 в 08:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: