Сборка быстрого деления на 2 - PullRequest
7 голосов
/ 10 января 2010

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

...
mov ecx, 2
idiv ecx
push eax #push the result
...

1 Ответ

21 голосов
/ 10 января 2010

Sure:

sar eax, 1

Код операции sar отличается от shr тем, что старший значащий (знаковый) бит сохраняется в sar, и он установлен в 0 в shr. Страница Арифметический сдвиг в Википедии показывает гораздо больше подробностей об этой операции в общем контексте.

Обратите внимание, что на машине дополнения 2 (которой является x86) это фактически вычисляет floor(eax / 2). В частности, это означает, что для целого числа x :

  • для x = 0 , результат 0
  • для x> 0 , результат равен floor (x / 2)
  • для x <0 </em>, результат также равен floor (x / 2) или -ceil (-x / 2)

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

...