Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.01.21;
Скачать: [xml.tar.bz2];

Вниз

Целый тип 8 байт   Найти похожие ветки 

 
Влад   (2007-01-02 16:53) [0]

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


 
Джо ©   (2007-01-02 16:58) [1]

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


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

Да.


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

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


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


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

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


 
Sha ©   (2007-01-02 20:34) [4]

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


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

а например такой кусочек кода?
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;


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

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


 
Sha ©   (2007-01-02 21:15) [7]

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


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

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


 
Sha ©   (2007-01-02 21:46) [9]

А у меня при 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:56) [10]

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


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

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


 
Sha ©   (2007-01-02 22:05) [12]

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


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

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


 
Sha ©   (2007-01-02 22:28) [14]

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

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


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

Хорошо, раз такой упорный.
Шифр 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:42) [16]

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


 
Влад   (2007-01-02 22:47) [17]

А мне надо свою.


 
Sha ©   (2007-01-02 22:50) [18]

сначала посмотри, как люди делают:
http://www.torry.net/pages.php?id=519


 
Влад   (2007-01-02 23:04) [19]

Ну посмотрел я. И так знаю, что программирую херово. Ты мне лучше б ошибки в моей программе указал.


 
Sha ©   (2007-01-02 23:06) [20]

Ты бы лучше вопрос мне задал.
Несложный :)


 
Влад   (2007-01-02 23:08) [21]


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

:))


 
Sha ©   (2007-01-02 23:10) [22]

Уже ответили [1] и [4].


 
Влад   (2007-01-02 23:14) [23]

Уже ответил [3] :)


 
Sha ©   (2007-01-02 23:20) [24]

Во-первых, начиная с D7, кажется, есть uint64.
Во-вторых, непонятно, для какой операции тебе не подходит int64?


 
Влад   (2007-01-02 23:28) [25]

За uint64 спасибо, а нужен он будет, например, для шифра 64/12/16


 
Sha ©   (2007-01-02 23:32) [26]

Интересно, чем не угодил int64?
Количество битов у него то же.


 
palva ©   (2007-01-02 23:54) [27]

> Как создать целый тип диапазоном от 0 до 2^64-1 (на 8 байт)?
Тип не создают, тип определяют, для вашего случая нужно определить запись, например так:

type
 TMyType = record
   l, h: LongWord
 end;

Потом реализовать функции, которые производят над этой записью арифметические операции.

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

Естественно, не будут. Эти операции применимы к целым числам а не к записям. int64 вам тоже не подойдет.

Если будете использовать int64, тогда будут правильно работать +, -, сдвиги и логические операции. Умножение и деление будут работать неправильно.

Пример:

{$APPTYPE CONSOLE}
uses SysUtils;
var
 ii: Int64;
begin
 ii := $8000000000000000;
 ii := ii div 2; // результат неправильный, поскольку комплиятор
                  // считает это число отрицательнлым.
 WriteLn(IntToHex(ii, 16)); // C000000000000000
 ii := ii SHR 2; // а здесь работает правильно
 WriteLn(IntToHex(ii, 16)); // 3000000000000000
 ReadLn
end.


Если в этом примере заменить Int64 на UInt64, то на BDS выводятся нули в обоих случаях. На D7 попробовать не могу, но там, насколько я когда-то пробовал UInt64 работает идентично Int64.


 
palva ©   (2007-01-02 23:56) [28]

Пропустил точку с запятой:
l, h: LongWord;


 
Влад   (2007-01-02 23:57) [29]

palva, большое спасибо. Теперь хоть понял, что не работает.


 
Sha ©   (2007-01-03 00:05) [30]

> palva ©   (02.01.07 23:54) [27]

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


 
Влад   (2007-01-03 00:15) [31]

а mod чем не деление?


 
Sha ©   (2007-01-03 00:22) [32]

> Влад   (03.01.07 00:15) [31]
а основание у mod какое? :)


 
palva ©   (2007-01-03 00:35) [33]

Sha ©   (03.01.07 00:05) [30]
Да, точно. Умножение тоже работает.


 
Sha ©   (2007-01-03 00:35) [34]

Вот самая страшная тайна масонов:
i mod 8 = i and 7


 
Sha ©   (2007-01-03 00:42) [35]

> palva ©   (03.01.07 00:35) [33]
ага,
а деление не работает не только из-за расширения знакового разряда,
там и команды разные.


 
Sha ©   (2007-01-03 00:52) [36]

> palva ©
Кстати, ничто не мешает написать свое деление по образцу Борланда с минимальными изменениями.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.01.21;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.046 c
15-1167220696
Ega23
2006-12-27 14:58
2007.01.21
К вопросу о наличии рыбы в Волге


2-1167913674
Neket
2007-01-04 15:27
2007.01.21
Иконка Программы


3-1162542442
Монг
2006-11-03 11:27
2007.01.21
Вопрос по компоненту cxGrid


2-1168071121
lo111
2007-01-06 11:12
2007.01.21
ASCII + #


15-1167383931
Ega23
2006-12-29 12:18
2007.01.21
C НАСТУПАЮЩИМ, КОЛЛЕГИ!!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский