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

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

Целый тип 8 байт [D7, NT4, 2000, XP]


Страницы:   1 2

Влад ©   (2007-01-02 16:53:00) 

Как создать целый тип диапазоном от 0 до 2^64-1 (на 8 байт)?
Будут ли с ним корректно работать операции xor, shl, shr, mod, div, +-  и т.д.?


Sha   (2007-01-02 22:42:00) [21]

Я ж говорил :)
В сети полно нормальных реализаций.


Влад   (2007-01-02 22:33:00) [22]

Хорошо, раз такой упорный.
Шифр RC5 32|12|16.
Функции кнопок button1 и button2 обратны друг другу.
Поля edit1 и edit2 - по 4 символа.

При нажатии последовательно button1 и button2 поля edit1 и edit2 не должны изменится.

...
q:array[0..25]of int64;
const
b=32;
r=12;
l=16;

implementation

{$R *.dfm}

function st(x,y:integer):int64;
var rez:int64;
i:integer;
begin
rez:=1;
for i:=1 to y do rez:=rez*x;
st:=rez;
end;

function toint(s:string):int64;
var i:integer;
rez:int64;
begin
rez:=0;
for i:=length(s) downto 1 do rez:=rez+ord(s[i])*st(256,length(s)-i);
toint:=rez;
end;

function tostr(s:int64;len:byte):string;
var i:integer;
rez:string;
begin
rez:='';
for i:=len downto 1 do rez:=rez+chr((s div st(256,i-1))mod 256);
tostr:=rez;
end;

procedure TForm2.Button1Click(Sender: TObject);
var a1,a2:int64;
b2:int64;
i:integer;
begin
a1:=toint(edit1.text);
a2:=toint(edit2.text);
b2:=st(2,b);
a1:=(a1+q[0])mod b2;
a2:=(a2+q[1])mod b2;
for i:=1 to r do begin
a1:=(((a1 xor a2)shl a2)+q[2*i])mod b2;
a2:=(((a2 xor a1)shl a1)+q[2*i+1])mod b2;
end;
edit1.text:=tostr(a1,b div 8);
edit2.text:=tostr(a2,b div 8);
end;

procedure TForm2.Button2Click(Sender: TObject);
var a1,a2:lint64;
b2:int64;
i:integer;
begin
a1:=toint(edit1.text);
a2:=toint(edit2.text);
b2:=st(2,b);
for i:=r downto 1 do begin
a2:=(((a2-q[2*i+1])mod b2)shr a1)xor a1;
a1:=(((a1-q[2*i])mod b2)shr a2)xor a2;
end;
a2:=(a2-q[1])mod b2;
a1:=(a1-q[0])mod b2;
edit1.text:=tostr(a1,b div 8);
edit2.text:=tostr(a2,b div 8);
end;

procedure TForm2.FormShow(Sender: TObject);
const pw=$b7e15163;qw=$9e3779b9;
var k:array[0..3]of int64;
i,j,d:byte;
a1,a2:int64;
begin
q[0]:=pw;
k[0]:=234222;
k[1]:=234;
k[2]:=234234;
k[3]:=32423;
for i:=1 to 25 do q[i]:=q[i-1]+qw;
i:=0;j:=0;a1:=0;a2:=0;
for d:=1 to 78 do begin
q[i]:=(q[i]+a1+a2)shl 3;
a1:=q[i];
k[j]:=(k[j]+a1+a2)shl(a1+a2);
a2:=k[j];
i:=i+1;
if i=26 then i:=0;
j:=j+1;
if j=4 then j:=0;
end;
end;


Sha   (2007-01-02 22:28:00) [23]

Это ты попробуй сформулировать свою проблему.
Например, так: знаю, что должно быть то-то, получаю то-то.

А так неясно, чего ты добиваешься.
Похоже, что код не твой, и ты не знаешь зачем он нужен :))


Влад   (2007-01-02 22:19:00) [24]

Нет, ты попробуй. В том-то и дело, что при одном и том же q, но разных a1 и a2 результат один и тот же.


Sha   (2007-01-02 22:05:00) [25]

Да на фига мне брать что-то.
И так ясно, что иногда результат сопадать может.
В чем проблема? В том, что числа одинаковые бывают?


Влад   (2007-01-02 21:58:00) [26]

Да, и числа в массиве q тоже не нули естественно, тоже побольше возьми.


Влад   (2007-01-02 21:56:00) [27]

Ну для начала r возьми не нулем. (у меня 20).
Соответственно количество чисел в массиве q - 42.
И попробуй в a1, a2 числа в диапазоне (2^30) - (2^32-1).


Sha   (2007-01-02 21:46:00) [28]

А у меня при a1:=1; a2:=2; и при a1:=2; a2:=1; результат разный.
В чем проблема-то?

procedure TForm1.Button10Click(Sender: TObject);
var
 q: array[0..1] of int64;
 a1, a2, b2: int64;
 i, r: integer;
begin
a1:=1; a2:=2;
q[0]:=0; q[1]:=0;
b2:=32;
r:=0;

a1:=(a1+q[0])mod b2;
a2:=(a2+q[1])mod b2;
for i:=1 to r do begin
a1:=(((a1 xor a2)shl a2)+q[2*i])mod b2;
a2:=(((a2 xor a1)shl a1)+q[2*i+1])mod b2;
end;

ShowMessage(Format('%d %d',[a1,a2]));
end;


Влад   (2007-01-02 21:38:00) [29]

через watches смотрю.


Sha   (2007-01-02 21:15:00) [30]

где выводится?


Влад   (2007-01-02 20:53:00) [31]

если брать a1,a2,q[i] как int64 для 32 бит, то при ЛЮБЫХ a1,a2 выводится один и тот же результат.


Влад   (2007-01-02 20:51:00) [32]

а например такой кусочек кода?
a1,a2,q[i] - 16, 32 или 64 бита, только положительные и 0.
b2- 2 в степени 16, 32 или 64 соответственно.

a1:=(a1+q[0])mod b2;
a2:=(a2+q[1])mod b2;
for i:=1 to r do begin
a1:=(((a1 xor a2)shl a2)+q[2*i])mod b2;
a2:=(((a2 xor a1)shl a1)+q[2*i+1])mod b2;
end;


Sha   (2007-01-02 20:34:00) [33]

Насколько помню, сдвиги для int64 реализованы даже лучше :)
например
int64 shr 64 = 0 (все ушло вправо за границу числа)
integer shr 32 = integer (число не изменилось)


Влад   (2007-01-02 17:12:00) [34]


> 64-битный тип в Делфи уже есть — Int64.

Во-первых, он может быть отрицательным, а во-вторых - максимальное положительное число в нем 2^63-1, этого мало.


Джо   (2007-01-02 17:00:00) [35]

Впрочем, он signed, т.е., –2^63..2^63–1.


Джо   (2007-01-02 16:58:00) [36]

64-битный тип в Делфи уже есть — Int64.


> Будут ли с ним корректно работать операции xor, shl, shr,
> mod, div, +-  и т.д.?

Да.


Страницы:   1 2

Наверх

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