При переводе некоторого кода DSP C ++ в ObjectPascal я вижу довольно много операторов «>>» на целых числах со знаком (правый операнд всегда равен 1 или 2). Я знаю, что для целых чисел со знаком C ++ выполняет арифметическое смещение вправо, а не логическое смещение вправо в Паскале.
В настоящее время я заменяю команды ‘div 2’ или ‘div 4’ для этих сдвигов ASR. Есть ли лучший или более общий способ справиться с этим?
Да, если предположить, что левый операнд является 32-битной переменной:
(x>>1)|0x80000000
(x>>2)|0xC0000000
И если вы хотите общий случай для x>>N
:
(x>>N)|(((1<<N)-1)<<(32-N))
Других решений пока нет …