Общеизвестно, что при делении целых чисел на степень двойки хороший компилятор сведет это к сдвигу битов.
Например:
int main(int argc, char **argv) {
return argc/2;
}
Clang -O2 компилирует это в:
movl %ecx, %eax
shrl $31, %eax
addl %ecx, %eax
sarl %eax
retq
Стоит отметить, что хотя эта последовательность инструкций намного быстрее, чем фактическая инструкция деления, это не просто сдвиг на один бит, как можно было бы надеяться. Предположительно, это связано с тем, что типичные процессоры, наряду с C, в конечном итоге остановились на усеченном делении (частное округляется до нуля), и это происходит не совсем точно соответствует арифметическому сдвигу вправо (и для точного сохранения семантики требуется уменьшение силы).
Какая разновидность целочисленного деления со знаком будет точно соответствовать арифметическому сдвигу вправо?