![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как осуществить сдвиг с переносом для 64 битного значения? [D7, WinXP]
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