Netspirit писал(а):
... я только сейчас узнал о существовании сдвига с сохранением последнего разряда
Ну я-то знаю про это "с детства". Процесс познания происходил у меня "снизу вверх", а не как сейчас принято.
Практически все процессоры обладают стандартным набором битовых манипуляций: циклические вращения вправо/влево (плюс такие же вместе с битом переноса CF), один левый сдвиг, и два правых - т.н. логический и арифметический.
Собственно, и все. НО, всегда и везде.
Пытался найти семантическое описание правого сдвига хотя бы в C/C++. Фиг-вам, как говорится...
У Страуструпа - ничего не нашел.
Про C примерно так:
Брайан Керниган, Деннис Ритчи писал(а):
Сдвиг вправо беззнаковой величины всегда сопровождается заполнением освобождающихся разрядов нулями. Сдвиг вправо знаковой величины на одних машинах происходит с распространением знака ("арифметический сдвиг"), на других — с заполнением освобождающихся разрядов нулями ("логический сдвиг").
Т.е., стандартом языка это не определено. Даже такого стандартизированного языка.
Чего уж там про Дельфи говорить.
Netspirit писал(а):
это было какое-то недоразумение в старых версиях Delphi
Да, скорее всего.
Потом просто убрали строку из интерфейса, а "смарт-линкинг" не включает неиспользуемые коды.
А артефакты оптимизационной самогенерации - остались в 4-ке. В 7-ке - и их прикончили.
Странно, правда, что не появляется warning, типа такого: XXX declared, but never used
Это, если не обращать внимание на слово "недоразумение".
ЯВУ таки является посредником между программистом и процессором. Как говорится, если у проца есть возможности - соблаговолите предоставить их программисту. Действительно, смотреть, как программисты на ЯВУ пытаются изобразить циклический сдвиг, так волосы шевелиться начинают:
function ror64(x: Int64; y: Byte): Int64;
begin
Result := (x shr y) or (x shl (64 - y));
end;
Ну типа, когда в языке нет нужных слов, то РАКЕТУ начинают определять как "летающую огнедышащую колесницу"
