![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Целый тип 8 байт [D7, NT4, 2000, XP]
Влад © (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, +- и т.д.?
Да.