Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как осуществить сдвиг с переносом для 64 битного значения? [D7, WinXP]


Страницы:   1 2

Still Swamp ©   (2006-09-17 19:21:00) 

Как осуществить сдвиг с переносом для 64 битного значения?


Still Swamp   (2006-09-18 19:17:00) [1]

Спасибо за науку.


begin...end   (2006-09-18 15:48:00) [2]

> Still Swamp   (18.09.06 13:29) [19]

Это циклический сдвиг (в приведённом примере -- циклический сдвиг 5-разрядного значения влево на 1 разряд).

В Delphi готовых средств для циклического сдвига Int64 я не встречал (хотя для 32-разрядных значений они есть), но можно сделать их самому из команд линейного сдвига. Вот пример (ROL для Int64 на 20 разрядов):

00000001001000110100010101100111  10001001101010111100110111101111  <-- исходное число (01234567 89ABCDEF)
01010110011110001001101010111100  11011110111100000001001000110100  <-- результат      (56789ABC DEF01234)


var
 I: Int64;
begin
 I := $0123456789ABCDEF;
 I := (I shr (64 - 20)) or (I shl 20);
 ShowMessageFmt('%x', [I])  <-- '56789ABCDEF01234'
end


Как видите, решение получилось в одну строчку. И без асма.


palva   (2006-09-18 15:25:00) [3]

Так это же сдвиг вправо?
Если сдвиг циклический, то пойдешь налево, придешь направо.


Anatoly Podgoretsky   (2006-09-18 15:23:00) [4]

Still Swamp   (18.09.06 13:29) [19]
А это уже циклический сдвиг, а не через перенос.
Через перенос будет 1.0010 + CF


Германн   (2006-09-18 14:36:00) [5]


> но надо было вот такое при сдвиге влево, причем желательно
> без ухода в асм:
> 10001 -> 00011

Так это же сдвиг вправо?


Still Swamp   (2006-09-18 13:29:00) [6]

Я уже в общем выкрутился, но надо было вот такое при сдвиге влево, причем желательно без ухода в асм:
10001 -> 00011

Что касается терминалогии, то я почему то всегда был уверен, что эта операция называется сдвиг с переносом. Те сдвигаем допустим байт и все биты на вуходе переносятся в противоположную часть.


begin...end   (2006-09-18 07:51:00) [7]

> Still Swamp   (17.09.06 23:00) [4]

Возможно, я тоже туплю. Чтобы никто из нас не тупил, давайте разбираться:

1. О каком переносе идёт речь? Что и куда должно быть перенесено?
2. Какой сдвиг нужен -- линейный (как в [1]) или циклический? Внимательно посмотрите на исходное и полученное значения в [1] -- Вам нужно это, или что-то другое?

Только без туманностей, плз. Чётко и конкретно.


Германн   (2006-09-18 01:56:00) [8]


> Германн ©   (18.09.06 01:53) [16]

P.S.
Имхо, да - относилось к
> Тут циклический сдвиг
> > обсуждается


Германн   (2006-09-18 01:53:00) [9]


> Джо ©   (18.09.06 01:43) [14]
>
> С терминологией тут нелады, ИМХО. Тут циклический сдвиг
> обсуждается или иное?
>


Имхо, да. Если учесть

Still Swamp   (17.09.06 23:00) [4]

хм... может я сильно туплю, но еще раз. shl сдвигает без переноса сдвигаемых бит. я проверил этот факт.


Германн   (2006-09-18 01:49:00) [10]


> Anatoly Podgoretsky ©   (18.09.06 00:53) [13]
>
> Ну конечно трюками можно это обойти.
>

Почему трюками? Неужели использование множеств и директивы absoluteесть большие трюки чем ASM-вставки в код паскалевской программы?


Джо   (2006-09-18 01:43:00) [11]

С терминологией тут нелады, ИМХО. Тут циклический сдвиг обсуждается или иное?


Anatoly Podgoretsky   (2006-09-18 00:53:00) [12]

Ну конечно трюками можно это обойти.


Германн   (2006-09-18 00:39:00) [13]


> Anatoly Podgoretsky ©   (18.09.06 00:25) [11]
>
> Что касается переноса придется делать на ассемблере, Дельфи
> не оперирует разрядом переноса.

Формально да. Но ассемблер не обязателен.


Anatoly Podgoretsky   (2006-09-18 00:25:00) [14]

Что касается переноса придется делать на ассемблере, Дельфи не оперирует разрядом переноса.


Pavia   (2006-09-18 00:05:00) [15]

Взять 128 битное число сделать сдвиг SHL потом сделать OR от нижней и верхней части.


oxffff   (2006-09-17 23:25:00) [16]

Тебе тогда надо использовать инструкции RCL или RCR


oxffff   (2006-09-17 23:13:00) [17]

Ты хочешь чтобы из CF на освободившееся место ?


Still Swamp   (2006-09-17 23:08:00) [18]

Действие CF на оператор SHL в Delphi распространяется?


oxffff   (2006-09-17 23:08:00) [19]

Если использовать SHLD, SHRD , то в CF последний бит, участвовавший в сдвиге.


oxffff   (2006-09-17 23:06:00) [20]

Что ты имеешь ввиду под переносом.

Сдвиг через флаг переноса CF


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо