powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ускорить функцию перевода массива байт в число
25 сообщений из 133, страница 4 из 6
Ускорить функцию перевода массива байт в число
    #39929806
Я кстати посмотрел те функции к примеру на asm, там люди не сделали твою ошибку.

В принципе как и Я не сделал в своём коде, от чего и умилялся в различие знаний
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929807
Но самый быстрый способ это по 8 байт shl-ээлить. А не по каждому байту в отдельности в целом, компоновкой. Ибо быстрее

Код: pascal
1.
2.
3.
4.
5.
6.
  movsxd  rax, pos
  mov     rax, qword ptr [arr + rax]
  lea     ecx, [8*len]
  neg     cl
  shl     rax, cl
  bswap   rax
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929808
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный, то есть to_num(ar, 1, 7) или to_num(ar, 100500, 100507) вернет ошибку?
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929809
cptngrb,

Да,вернёт ошибку. Ибо элементы будут неверно подсчитаны.
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929811
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный, не верно подсчитаны? у меня индекс К , а не i, j
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929812
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
function to_num(arr: arBytes; const 0, 7: integer):UInt64;
var
  k: integer;
begin
  Result:= arr[0]; //первый раз
  for k:= 1 to 7 do begin //1, 2, 3, 4, 5, 6, 7 итого 8
    Result:= Result shl 8;
    Result:= Result or arr[k];
end;
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929813
cptngrb,

Да как же ты не понимаешь? Вот тебе пример, который наглядно демонстрирует ошибку

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils;

function to_numFix(arr: array of byte; const i, j: integer): UInt64;
var
  k: integer;
begin
  Result := arr[i];
  for k := (i + 1) to i + j do
  begin
    Result := Result shl 8;
    Result := Result or arr[k];
  end;
end;

function to_num(arr: array of byte; const i, j: integer): UInt64;
var
  k: integer;
begin
  Result := arr[i];
  for k := (i + 1) to j do
  begin
    Result := Result shl 8;
    Result := Result or arr[k];
  end;
end;

begin
  try

    Writeln('Багованная стоковая функция');

    Writeln(to_num([5, 8, 5], 0, 2));
    Writeln(to_num([8, 5, 2, 7, 9, 2, 7, 9, 2, 5, 8, 5, 6, 7, 8, 1], 9, 2));

    Writeln('Фикс функции');

    // Тут по прежнему будет 329733
    Writeln(to_numFix([5, 8, 5], 0, 2));

    // А тут станет 329733 вместо 5
    Writeln(to_numFix([8, 5, 2, 7, 9, 2, 7, 9, 2, 5, 8, 5, 6, 7, 8, 1], 9, 2));

  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;

end.



Выведет в консоль
Код: sql
1.
2.
3.
4.
5.
6.
Багованная стоковая функция
329733
5
Фикс функции
329733
329733
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929815
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный, ять, у тебя параметры (9, 2) с чего? по моей логике должно быть (9, 10). Ты понимаешь под вторым параметром len, а я последний индекс
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929816
cptngrb,

У нас есть массив

[
1 = 8,
2 = 5,
2 = 2,
3 = 7,
4 = 9,
5 = 2,
6 = 7,
7 = 9,
8 = 2,
9 = 5,
10 = 8,
11 = 5,
12 = 6,
13 = 7,
14 = 8,
15 = 1
]

По этому 9 и 2 это будет 5, 8, 5 что в итоге = 329733 о чём нам и говорит вызов
Код: pascal
1.
Writeln(to_numFix([5, 8, 5], 0, 2));
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929819
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный, 9 и 2 быть не может, т.к. после 9 идут числа 10, 11, 12.
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929821
cptngrb,

Ты знаешь что такое индексы ?


arr[9] + 2 элемента. В итоге будет 3 элемента которые = 329733
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929822
Вот тебе хороший пример как это должно работать

http://www.delphibasics.ru/Move.php

Точно так - же 100% Есть источник(Массив), есть начальная позиция в массиве, и есть количество байт которые мы должны подсчитать из массива
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929823
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный, откуда мне о индексах знать то. Блин, я ему про Фому, а он мне про Ерему.
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929824
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Троль?
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929825
cptngrb,

Почитай как работать с массивами, и вообще как работает память.

Начальный индекс, это начала массива. Он 0. А значит конец индекса байтового массива, это максимальная длина его
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929826
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Вот тебе хороший пример как это должно работать

http://www.delphibasics.ru/Move.php

Точно так - же 100% Есть источник(Массив), есть начальная позиция в массиве, и есть количество байт которые мы должны подсчитать из массива


Я определяю кол-во байт, как начальная позиция, например [10] и конечная, например [17]. Итого 8 байт. 64 бита. UInt64.
и в мою функцию если передать to_num(arr, 10, 17), то она вернет правильное значение
твоя функция to_num_fix(arr, 10, 8), тоже вернет правильное значение
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929827
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
cptngrb,

Почитай как работать с массивами, и вообще как работает память.

Начальный индекс, это начала массива. Он 0. А значит конец индекса байтового массива, это максимальная длина его


это трындец.
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929828
cptngrb
to_num(arr, 10, 17)


Неверно, ты должен передать 18

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils;

function to_numFix(arr: array of byte; const i, j: integer): UInt64;
var
  k: integer;
begin
  Result := arr[i];
  for k := (i + 1) to i + j do
  begin
    Result := Result shl 8;
    Result := Result or arr[k];
  end;
end;

function to_num(arr: array of byte; const i, j: integer): UInt64;
var
  k: integer;
begin
  Result := arr[i];
  for k := (i + 1) to j do
  begin
    Result := Result shl 8;
    Result := Result or arr[k];
  end;
end;

begin
  try

    Writeln('Багованная стоковая функция');

    Writeln(to_num([5, 8, 5], 0, 2));
    Writeln(to_num([8, 5, 2, 7, 9, 2, 7, 9, 2, 5, 8, 5, 6, 7, 8, 1], 9, 11));

    Writeln('Фикс функции');

    // Тут по прежнему будет 329733
    Writeln(to_numFix([5, 8, 5], 0, 2));

    // А тут станет 329733 вместо 5
    Writeln(to_numFix([8, 5, 2, 7, 9, 2, 7, 9, 2, 5, 8, 5, 6, 7, 8, 1], 9, 2));

  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;

end.



Зачем вообще передавать 18??? Если у тебя уже определена начальная позиция массива.
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929829
cptngrb,

Ты мне лучше скажи. Ты вообще собираешься считать от позиции X больше 8 байтов ? Или нет. Это вообще всех волнует в топике.
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929830
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
cptngrb
to_num(arr, 10, 17)

Неверно, ты должен передать 18

а вот и нет

ВсеРазумный

Зачем вообще передавать 18??? Если у тебя уже определена начальная позиция массива.

потому что могу)
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929832
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это в какое такое я число смогу считать больше 8 байт?
Ответ: нет, на большее я не замахнусь)
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929833
cptngrb
ВсеРазумный
пропущено...

Неверно, ты должен передать 18

а вот и нет


А вот и да
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929835
cptngrb
это в какое такое я число смогу считать больше 8 байт?
Ответ: нет, на большее я не замахнусь)


СПАСИИИБО

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
function Convert2(arr: array of byte; pos, len: integer): UInt64;
{$IF Defined(CPUX86)}
var
  Lo, Hi: Cardinal;
begin
  Result := PUInt64(@arr[pos])^ shl (8 * (8 - len));

  Lo := Int64Rec(Result).Hi;
  Hi := Int64Rec(Result).Lo;
  Int64Rec(Result).Hi := (Hi shr 24) or ((Hi and $00FF0000) shr 8) or
    ((Hi and $0000FF00) shl 8) or (Hi shl 24);
  Int64Rec(Result).Lo := (Lo shr 24) or ((Lo and $00FF0000) shr 8) or
    ((Lo and $0000FF00) shl 8) or (Lo shl 24);
{$ELSEIF Defined(CPUX64)}
asm
  movsxd  rax, pos
  mov     rax, qword ptr [arr + rax]
  lea     ecx, [8*len]
  neg     cl
  shl     rax, cl
  bswap   rax
  {$ENDIF}
end;

function Convert3(arr: array of byte; pos, len: integer): UInt64;
begin
  Result := Convert2(arr, pos, len);
end;






Держи и пользуйся, функция которую я привёл в сообщение 22084968


Ибо пару сообщений назад меня уверяли что ты собираешься считать больше 8 байтов
22084564

А так же до этого другие люди подумали так 22084394
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929836
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный, а вот и нет.
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929837
cptngrb,

Короче, вот пример
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils;

function to_numFix(arr: array of byte; const i, j: integer): UInt64;
var
  k: integer;
begin
  Result := arr[i];
  for k := (i + 1) to i + j do
  begin
    Result := Result shl 8;
    Result := Result or arr[k];
  end;
end;

function Convert2(arr: array of byte; pos, len: integer): UInt64;
{$IF Defined(CPUX86)}
var
  Lo, Hi: Cardinal;
begin
  Result := PUInt64(@arr[pos])^ shl (8 * (8 - len));

  Lo := Int64Rec(Result).Hi;
  Hi := Int64Rec(Result).Lo;
  Int64Rec(Result).Hi := (Hi shr 24) or ((Hi and $00FF0000) shr 8) or
    ((Hi and $0000FF00) shl 8) or (Hi shl 24);
  Int64Rec(Result).Lo := (Lo shr 24) or ((Lo and $00FF0000) shr 8) or
    ((Lo and $0000FF00) shl 8) or (Lo shl 24);
{$ELSEIF Defined(CPUX64)}
asm
  movsxd  rax, pos
  mov     rax, qword ptr [arr + rax]
  lea     ecx, [8*len]
  neg     cl
  shl     rax, cl
  bswap   rax
  {$ENDIF}
end;

begin
  try

    Writeln('Фикс функции');

    Writeln(to_numFix([5, 8, 5], 0, 2));
    Writeln(to_numFix([8, 5, 2, 7, 9, 2, 7, 9, 2, 5, 8, 5, 6, 7, 8, 1], 9, 2));


    Writeln('Новая функция Convert2');

    Writeln(Convert2([5, 8, 5], 0, 3));
    Writeln(Convert2([8, 5, 2, 7, 9, 2, 7, 9, 2, 5, 8, 5, 6, 7, 8, 1], 9, 3));

  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;

end.




Работает без циклов и так далее. Самая быстрая функция
...
Рейтинг: 0 / 0
25 сообщений из 133, страница 4 из 6
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ускорить функцию перевода массива байт в число
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]