Побитовый сдвиг

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Побитовый сдвиг

Сообщение 0minus273 » 12.03.2010 17:32:59

Как реализовать неротационный (числа, которые "вытеснены" нулями не возвращаются в начало кода, а исчезают навеки) беззнаковый (в независимости от знака числа заполнение нулями) побитовый сдвиг longint'ов (32 бита) ?
[т.е., по сути, сделать аналог >>> из Явы;
input: longint, output: longint]

Встроенный в Паскале SHR не подходит, ибо: a SHR 32 = a (ротация), а дб a SHR 32+ = 0
Аватара пользователя
0minus273
незнакомец
 
Сообщения: 5
Зарегистрирован: 04.03.2010 17:59:29
Откуда: СПб

Re: Побитовый сдвиг

Сообщение hinst » 12.03.2010 17:44:32

чего? что-то я не вкуриваю. нет в паскале никакой ротации. там они исчезают
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: Побитовый сдвиг

Сообщение 0minus273 » 12.03.2010 19:21:37

uses crt;

var
kk : longint;

begin

kk := -3;
kk := kk SHR 32;
writeln (kk);

end.

у меня возвращает -3
Аватара пользователя
0minus273
незнакомец
 
Сообщения: 5
Зарегистрирован: 04.03.2010 17:59:29
Откуда: СПб

Re: Побитовый сдвиг

Сообщение hinst » 12.03.2010 20:47:25

не могёт быть. я точно помню, что когда я чего-то там делал полгода назад, оно сдвигалось с образующимися нулями
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: Побитовый сдвиг

Сообщение Sergei I. Gorelkin » 13.03.2010 00:00:31

Операторы shl/shr превращаются в одноименные команды процессора. Сдвиг 32-битного операнда на 32 бита на процессорах x86 возвращает исходный результат. Это особенность x86, не имеющая отношения к ротации.
Для ротации в FPC существуют ф-ции RolByte, RolWord, RolDWord, RolQWord, RorByte, RorWord, RorDword, RorQword.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1397
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Побитовый сдвиг

Сообщение Mr.Smart » 13.03.2010 00:38:02

Sergei I. Gorelkin
Не знал про эти функции. Век живи, век учись :wink:
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Побитовый сдвиг

Сообщение 0minus273 » 13.03.2010 02:47:43

Sergei I. Gorelkin
А вот это интересно. Спасибо, не знала.

Однако же, если я не могу сейчас сменить процессор, как мне реализовать нужный сдвиг?
К сожалению, мой тн "опыт" позволяет мне думать только об обращении с рез-татом IntToBin, как с массивом чаров, а это, по-моему, не соответствует идее "дешевизны" побитовых операторов? Или я ошибаюсь?
Аватара пользователя
0minus273
незнакомец
 
Сообщения: 5
Зарегистрирован: 04.03.2010 17:59:29
Откуда: СПб

Re: Побитовый сдвиг

Сообщение Sergei I. Gorelkin » 13.03.2010 03:25:36

Достаточно просто добавить проверку величины сдвига и возвращать 0, если она 32 или более.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1397
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Побитовый сдвиг

Сообщение alexrayne » 13.03.2010 16:11:19

Сдвиг 32-битного операнда на 32 бита на процессорах x86 возвращает исходный результат. Это особенность x86, не имеющая отношения к ротации.

это баг или фича? как сам интел это коментирует? оно на всех х86 или только интеловых?

а если сдвигать 2 раза на 16, оно правильно сдвинется?

Достаточно просто добавить проверку величины сдвига и возвращать 0, если она 32 или более.

+1, + надо включить поддержку -Cppentium2 для того чтоб ето условие быстро исполнялось.
кстати для нормального использования инструкций cmove есть какаято правильная и неправильна запись условий? насколько я понимаю
result := ifthen(rot > 31,0, value shr rot);
будет однозначно с использованием cmove ибо оба операнда вычислены, а вот аналог
if rot <= 31 then
result := value shr rot
else
result := 0;
уже неочевидно. Просветите Сергей.
alexrayne
постоялец
 
Сообщения: 125
Зарегистрирован: 03.12.2008 16:56:26

Re: Побитовый сдвиг

Сообщение Sergei I. Gorelkin » 14.03.2010 00:25:49

alexrayne писал(а):это баг или фича? как сам интел это коментирует? оно на всех х86 или только интеловых?

Понятия не имею...
alexrayne писал(а):а если сдвигать 2 раза на 16, оно правильно сдвинется?

Должно сдвигаться правильно

alexrayne писал(а):+1, + надо включить поддержку -Cppentium2 для того чтоб ето условие быстро исполнялось.кстати для нормального использования инструкций cmove есть какаято правильная и неправильна запись условий? насколько я понимаюresult := ifthen(rot > 31,0, value shr rot);будет однозначно с использованием cmove ибо оба операнда вычислены, а вот аналог...

Хотелось бы мне дожить до дня, когда компилятор научится превращать вызов функции в одну команду...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1397
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Побитовый сдвиг

Сообщение alexrayne » 14.03.2010 01:52:35

Хотелось бы мне дожить до дня, когда компилятор научится превращать вызов функции в одну команду...

Свершиось Сергей, благую весть Вам несу - ifthen такая редкая функция в которой так оно и есть.!!! :D
alexrayne
постоялец
 
Сообщения: 125
Зарегистрирован: 03.12.2008 16:56:26

Re: Побитовый сдвиг

Сообщение Sergei I. Gorelkin » 14.03.2010 03:47:07

Ух ептыть, вот уж точно, знание - сила страшнее красоты :D

Я затрудняюсь сказать, как поведет себя обычное условие. Проще проверить, скомпилировав в ассемблер.
Но, при использовании ifthen, получается что мы выигрываем на ветвлении, но проигрываем на вычислении результата сдвига, т.к. вычисляем его даже если он не будет использован.
Я бы написал вот так:
Код: Выделить всё
if rot > 31 then
  value := 0;
value := value shr rot;   // ноль останется нулем при любом rot.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1397
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Побитовый сдвиг

Сообщение 0minus273 » 14.03.2010 19:24:34

спасибо за консультацию всем!
Аватара пользователя
0minus273
незнакомец
 
Сообщения: 5
Зарегистрирован: 04.03.2010 17:59:29
Откуда: СПб


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 46

Рейтинг@Mail.ru