![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Бинарные операции [D6, Win95/98, WinXP]
Нуждающийся в помощи © (2005-02-25 10:14:00)Прошу помощи в решении вот такой задачи:
Есть i: array [1..1000000000] of integer, и есть еще четыре массива b: array [1..1000000000] of byte.
Нужно наиболее быстро сформировать значения для четырех байтовых масивом по такому принципу:
b1[1]=первые восемь бит i[1];
b2[1]=вторые восемь бит i[1];
b3[1]=третьи восемь бит i[1];
b4[1]=четвертые восемь бит i[1]
Сейчас преобразую integer в бинарную строку, после чего используя pos беру нужные тетрады и преобразую обратно в byte.
Но чуствую, что это совсем не самый скоростной вариант.
Юрий Зотов (2005-02-25 10:38:00) [1]type
PBytes = ^TBytes;
TBytes = packed record
i4, i3, i2, i1: byte
end;
var
P: PBytes;
...
for j := 1 to 1000000000 do
begin
P := @i[j];
b1[j] := P^.i1;
b2[j] := P^.i2;
b3[j] := P^.i3;
b4[j] := P^.i4
end;
Digitman (2005-02-25 10:33:00) [2]var
iarray: array[1..10] of Integer;
b1, b2, b3, b4: array[1..10] of Byte;
barrays: array[0..3] of PByteArray = (@b1, @b2, @b3, @b4);
i, j: Integer;
...
for i := 1 to 10 do
for j := 0 to 3 do
barrays[j][i] := PByteArray(@iarray[i])[j];
Anatoly Podgoretsky (2005-02-25 10:26:00) [3]Размер этих массивов 8 гб
TUser (2005-02-25 10:19:00) [4]CopyMemory
Но очень плохо, что копировать придется по одному байту. Если возможно организуй так - b1[1]-b1[4] = i[1] и т.д., т.е. b1 = i[1..length(i) div 4], далее b2 и пр.